小ネタ。
[1,2,3].map(a => a + 1)
が、 Elm だと
[1,2,3] |> List.map (\a -> a + 1)
で、両方とも左から右に読めるからそんなに変わらないなーと思ってたんだけど、一つ違う点に気づいた。JavaScript で Promise を気持ちよく連鎖してて書いてて、いざ並列実行しようとなった時に
const promises = [1,2,3].map(a => a + 1).map(toPromise) Promise.all(promises)
のように少し回りくどくなり、なぜ promises.all()
と書けないのかと考えたら「配列にメソッドを追加するのが微妙だから」と気づいた(prototype 拡張で不可能ではない)。一般的に言うと既存の型に何か関数を追加できない。
Elm のパイプを使う場合、その制約はなくて
[1,2,3] |> List.map (\a -> a + 1) |> Debug.log "converted" -- List に対して Debug モジュールの関数を使う |> List.map toString |> MyListUtil.getByIndex 1 -- List に対して MyListUtil モジュールの関数を使う |> Debug.log "result" -- Maybe に対して Debug モジュールの関数を使う
こうしてどんどん連鎖できる。便利。
と言うのを、 JavaScript と Elm を行ったり来たりしてて気づいた。おわり。