タイトルとちょっと違うかもですが、自分が仕事中とかに「あれ?これどっちだっけ」って一瞬なるようなやつをメモ。
自分がまだ出会ってないだけで、
これも、あるあるだよってのがあったら、コメントで教えてくださいな
(比較用に見易さ重視なformatにしてます。formatterに沿って書くとそれぞれちょっと変わるので。)
:
と::
これ一番紛らわしいんですが...
Haskellでは、
:
が、配列の要素を前方追加する関数(関数(:))で、
::
が、関数のシグネチャ書く時に使うやつ。
consZero :: [Int] -> [Int]
consZero xs = 0 : xs
逆にElmでは、
:
が、関数のシグネチャ書く時に使うやつ(なんて言うの?)で、
::
が、配列の要素を前方追加する関数(Listパッケージの関数(::))
consZero : List Int -> List Int
consZero xs = 0 :: xs
配列の型([a]
, List a
)
上でも使ったが、配列の型の書き方が違う。
a型の配列の型は、
Haskellでは、[a]
と書いて、
Elmでは、List a
と書く。
$
と<|
たまに書き間違えてて、build時に気付く(あほ)
特に流れに乗って書いてる時...
どっちも同じ使い方(のはず)
h(g(f(x)))
を
Haskellでは、($) : (a -> b) -> a -> b
(Data.Functionパッケージ)を使って
h $ g $ f x
と書けて、
Elmでは、(<|) : (a -> b) -> a -> b
(Basicsパッケージ)を使って
h <| g <| f x
と書ける。
整数のリスト([1..10]
とrange 1 10
)
例えば、1から1刻みで10までの整数のリストを定義する時
Haskellでは、[1..10]
と書けるが、
Elmでは、[1..10]
と書けない。(0.18から書けなくなった。)
代わりに、range : Int -> Int -> List Int
(Listパッケージ)を使って、List.range 1 10
と書く。
Haskellだと、[1, 1.1..10]
で1から0.1刻みで10までのリストが定義できるが、
Elmで同じような定義する場合、いい方法ないんですかね?
がんばって書くか
List.map (\a -> toFloat a / 10) <| List.range 10 100
という感じ?
2つのリストへの操作(zipwith
, map2
)
2つのリストの同Indexの要素受け取ってごにょごにょする関数は、
Haskellでは、zipwith : (a- > b -> c) -> [a] -> [b] -> [c]
(Data.Listパッケージ)使って
import Data.List as List
List.zipwith (+) xs ys
という感じ。
Elmでは、map2 : (a- > b -> c) -> List a -> List b -> List c
(Listパッケージ)使って
List.map2 (+) xs ys
という感じ。
ちなみに、
3つのリストへの~ならそれぞれzipwith3
,map3
4つのリストへの~ならそれぞれzipwith4
,map4
...
zipwith7
とmap5
までは定義されてる。
配列の要素のフィルタリング(mapMaybe
とfilterMap
)
Haskellでは、mapMaybe : (a -> Maybe b) -> [a] -> [b]
(Data.Maybeパッケージ)を使って
import Data.Maybe as Maybe
Maybe.mapMaybe (\x ->
case (x 'mod' 3, x 'mod' 5) of
(0, 0) -> Just x
(0, _) -> Just $ x * 5
(_, 0) -> Just $ x * 3
_ -> Nothing
) xs
という感じ。
Elmでは、filterMap : (a -> Maybe b) -> List a -> List b
(Listパッケージ)を使って
List.filterMap (\x ->
case (x % 3, x % 5) of
(0, 0) -> Just x
(0, _) -> Just <| x * 5
(_, 0) -> Just <| x * 3
_ -> Nothing
) xs
という感じ。
文字列変換(show
とtoString
)
値を出力する時とかに、文字列に直すのは、
Haskellは、show
を使って、
Elmは、toString
を使う。
(どっかの記事に、"value" ++ show value
でshow
とか使わず、
C++のcoutの時みたいに "value" ++ value
って書ける様にするってのがあった気がするが...)