15
6

More than 5 years have passed since last update.

Elm,Haskellの記述で紛らわしいものメモ

Posted at

タイトルとちょっと違うかもですが、自分が仕事中とかに「あれ?これどっちだっけ」って一瞬なるようなやつをメモ。

自分がまだ出会ってないだけで、
これも、あるあるだよってのがあったら、コメントで教えてくださいな
(比較用に見易さ重視な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
...
zipwith7map5までは定義されてる。

配列の要素のフィルタリング(mapMaybefilterMap)

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

という感じ。

文字列変換(showtoString)

値を出力する時とかに、文字列に直すのは、
Haskellは、showを使って、
Elmは、toStringを使う。

(どっかの記事に、"value" ++ show valueshowとか使わず、
C++のcoutの時みたいに "value" ++ valueって書ける様にするってのがあった気がするが...)

15
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
6