個人的Elm文法メモ

2019/04/02

前回の個人的Elmコマンドメモに引き続き個人的な備忘メモです。

今回は文法周り。

関数

関数名 引数 引数 … = 式

関数名は必ず小文字で始まる。慣習としてcamel caseを使う。

> add a b = a + b
<function> : number -> number -> number
> add 1 3
4 : number
>

中置演算子を関数として使うこともできる。

> (+) 1 4
5 : number
> (&&) True False
False : Bool
>

if式

if 条件式 then 真の場合 else 偽の場合

> if True then "dog" else "cat"
"dog" : String
>

if式は値を返す。elseは省略できない。複数条件がある場合は else ifを連結可能。

let式

関数の中に一時的な変数を定義する。複数の変数を定義できる。

> let\
|       a = 1\
|       b = 2\
|       add x y = x + y\
|   in\
|       add a b\
|
3 : number
>

let式はif式同様にブロック全体で式になり、値を返す。

データ構造:リスト、タプル、レコード

リスト

同じ型の複数の要素を保持する。Listモジュールで操作可能。

> []
[] : List a
> [1, 2, 3]
[1,2,3] : List number
> List.reverse ["a", "b", "c", "d"]
["d","c","b","a"] : List String
>

Elmのリストは連結リスト(Linked List)である。

タプル

「組」を表す。異なる型を組にできる。要素数は3個が上限。要素が2個の場合はTuple.firstTuple.secondで値を取り出せる。

(0,"hello") : ( number, String )
> (0, "hello", True)
(0,"hello", True) : ( number, String, Bool )
> Tuple.first (0, "hello")
0 : number
> Tuple.second (0, "hello")
"hello" : String
>

レコード

名前付きのフィールドを持つ。

> account = { id = 1, name = "Bob", password = "abc" }
{ id = 1, name = "Bob", password = "abc" }
    : { id : number, name : String, password : String }
> account.id
1 : number
> account.name
"Bob" : String
>

ElmはImmutableなので、更新すると新しいレコードが作られる。更新の際にフィールドの数を増減させたりフィールドの型を変えたりはできない。

引数の型 -> 引数の型 -> … -> 結果の型

となる。

> String.slice
<function> : Int -> Int -> String -> String
> String.slice 0 5 "hello world"
"hello" : String
>

String.sliceは第1引数がInt、第2引数がInt、第3引数がStringでStringを返す関数である。

> identity
<function> : a -> a
>

「a」は型変数で、任意の型を意味する。

Elmでは型が暗黙的にキャストされることはない。関数を使って明示的にキャストする。

関数の型は型注釈(Type annotation)で定義できる。関数のすぐ上にType annotationを併記する。型推論があるのでType annotationがなくても動くが、関数利用者に使い方を明記できる、実装が間違っているときにコンパイルエラーにできるというメリットがある。

type aliasで型に別名を付けられる。あくまでaliasなので実体は元のまま。

Elmにはnullがない。代わりにMaybeというデータ型を使う。


とりあえずこんな感じ。気が向いたら追記するかも。

ちなみに、今回の記事、あくまで個人的に引っかかったところをまとめただけなので網羅性はありません。ちゃんと勉強したい方は「基礎からわかる Elm」がおススメ。




関連(するかもしれない)記事


おススメ