Dev日記

プログラミング学習のまとめなど

関数型よく知らない人の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にリセット

こういうふうに、「最後の引数をターゲットオブジェクト」にすると関数同士を組み合わせやすくなります。


まだ完全に慣れきってないですが使いこなすと面白いですね。

少しずつ使い方を覚えていきたいところです。