関数型よく知らない人のelm入門(4) - 引数の順序
今回は自分なりにつかんだ elm のコツでも。コツというよりも「オブジェクト指向からの頭の切り替え方」とでもいいましょうか。
最初は引数の順番わけわからん!という状態でしたが、組んでいくうちに「ルール」みたいなものをちょっとずつ掴めてきました。
正しいとはいい切れないかもしれませんが、多少参考になれば。(たぶんですけど関数型全般に共通する要因かと思います)
引数の順序
今回は引数の順序について。
Javaだとドットの左にあるオブジェクト、これが elm だとだいたい最後の引数になります。
//java List<String> list = ... List<Integer> lengthList = list.map(String::length) //elm. list = [...] --文字列 List.map String.length list
ついJavaの感覚だと、 List.map list String.length
と書きたくなっちゃうんですよね…
が、書いていくうちに「対象オブジェクト」を最後にした方が楽だと気づきました。
type alias Point = {x:Int, y:Int} --java的順番。 Point moveX(int x) moveX : Point -> Int -> Point moveX p x = {p | x = x} moveY : Point -> Int -> Point moveY p y = {p | y = y} point = Point 0 0 --XとYを移動させたいが、パイプでつなげれない! --ビルドエラー point2 = moveX point 2 |> moveY point 3 --一回別変数に格納するしかなさそう point2 = moveX point 2 point3 = moveY point2 3
上のを見ただけでも面倒ですよね。順序を逆にしてみましょう。
moveX : Int -> Point -> Point moveX x p = {p | x = x} moveY : Int -> Point -> Point moveY y p = {p | y = y} --こっちだと楽できる point2 = point |> moveX 2 |> moveY 3
後者のほうが便利ではないでしょうか? またこんなこともできます。
--x y とも 0にする関数をこうやってつくれる reset = moveX 0 << moveY 0 -- point = Point 2 3 point2 = reset point -- 0,0 になる --こんなことも pointList = [Point ..., POint ...] allReset = List.map reset pointList --全部0にリセット
こういうふうに、「最後の引数をターゲットオブジェクト」にすると関数同士を組み合わせやすくなります。
まだ完全に慣れきってないですが使いこなすと面白いですね。
少しずつ使い方を覚えていきたいところです。