どんな多きなプログラムも小さなプログラムの組み合わせです。Elmでは、式を組み合わせて main 関数をつくってプログラムになります。
しかし、プログラマは人間なので多くのミスをします。ミスは早期発見できたほうが時間の節約になります。
Elmは、プログラムのミスを早期発見するために「型」という画期的な仕組みがあります。型は、どんな値になりうるか、プログラムにレールを敷くようなものです。
型というレールから、値が外れていたら、$ elm make(コンパイル)するときにエラーで知らせてくれます。
「値」と「型」
値には、String型 (文字列) や Int型 (整数)など型がついています。
Int -> Int 型の関数に渡せる値は、Int型の値のみです。"Hello World" などの文字列を渡そうとしたら、$ elm make(コンパイル)するときにエラーで落ちてしまいます。
では、"42"は、渡せるのかというと、それは違います。ダブルクォーテーション( " )がついているから、これは整数に見えても、String型として扱われるのです。
この関数( Int-> Int )に渡せるのは、42というような整数のみです。
結果として整数になるなら、式の結果でも問題ありません。たとえば次のような例は、問題ありません。
1 + 2-
(Math.abs 1)補足: Math.absの型は、Int -> Int型です。
上記のような式の結果も値として扱われます。
パズルで例えると、最終的に欲しい値を求めるために、ピースを組み合わせるようなイメージです。
少し複雑な例ですが、 Int -> String -> Int -> Int のような関数があったら、次の値をその関数に渡さなければいけません。
- Int型の値
- String型の値
- Int型の値
戻り値であるIntの値が欲しければ、この三つの値を関数に渡す必要があります。引数を渡す順番を変えたり省略することはできません。
NOTE: 高階関数と部分適用 という概念をマスターすれば、ピースを加工して、パズルのピース(関数や式のこと)を組み合わせられます。
List型
小さな式を組み合せて、より多きな式をつくるように、小さな型も組み合わせて多きな型にできます。
List型の正式な型は、List aです。このaは、型引数といって、自分の好きな型を与えることができます。
例えば、List型は、Int型を渡せば List Int型になります。String型を渡せば List String型です。これは、まるでInt型やString型などの単純な型を加工しているようです。
次にあげる式は、すべてList型です。
-
[1, 2, 3]要素3個のList Int -
["Hello", "World"]要素2個のList String
要素の型に応じてListの型が決まります。
NOTE: 空のリストは、Listの型は、未確定となります。StringだったとしてもIntだったとしても、空リストを表現する値は、[]という同じ式になるからです。
Maybe型
List型では、複数の値(0個でも1個でも100個でも)を扱う型をつくれますが、もっと単純に0個か1個の値を扱いたい場合もあります。その場合に使える型が、Maybe型です。'Maybe' という英単語は、直訳すると、「多分」という意味です。
「多分、値が存在する」という状態を言い変えると0個か1個の値を保持してると言えます。
値が存在する場合は、次のように表現します。
Just 42
イメージとしては、「ただ単純に42という値があります」という表現です。
このJust 42という値は、Maybe Int型になります。42という値は、Int型なので、Maybe Intとなるわけです。
もし、
Just "Hello" であれば、この値の型は、Maybe String型です。
値が存在しない場合は、次のように表現します。
Nothing
この値の型は、この時点では決定しません。
まとめ
本記事では、次のことを説明しました。
- プログラマのミスを早期発見するために型がある。
- 小さな型を組み合わせて大きな型をつくれる。
Elmでプログラムを書いていると、型エラーをよく目にすることになります。エラーという語彙からネガティブな印象を受ける必要はありません。例えるなら、赤ペン先生が常にプログラムからミスを排除するようにサポートしてくれてるようなものです。
