Union Typeとcase ~ of
Elmでは、有限個の値を持つ型を定義することができます。他の言語の列挙型(enum)のようなものです。 type 型名 = 値1 | 値2 | ...のように宣言します。
type Visibility = All | Active | Completed
上のように宣言すると、Visibility型の値は、All、Active、Completedのいずれかになります。 また、次のように、各値には追加で別の値を持たせることもできます。
type User = Anonymous | LoggedIn String user : User user = LoggedIn "john"
User型の値は、Anonymousか、String型の値を1つ保持したLoggedInです。
Union Typeの値は、case ... ofで分岐することができます。
userPhoto : User -> String
userPhoto user =
case user of
Anonymous ->
"anon.png"
LoggedIn name -> -- 中身のStringをnameという変数として取り出す
"users/" ++ name ++ "/photo.png"
photo = userPhoto (LoggedIn "john") -- "users/john/photo.png"
Maybe
Maybeは「値があるかもしれないし、ないかもしれない」ことを表す型で、次のように定義されています。
type Maybe a = Just a | Nothing
Maybeの後ろにあるaは型引数と呼ばれ、任意の型を当てはめることができます。例えば、Int型に限定したいときは次のようにします。
value : Maybe Int value = Just 10
Maybe型の値を取り出すためにはcase ... ofを使います。
-- List.head : List a -> Maybe a
-- List.headはリストの先頭の値を返す関数で、リストが空であればNothing 、空でなければJust aを返す。
message list =
case List.head list of
Just n ->
"head is " ++ n
Nothing ->
"empty!"
mes = message [1,2,3] -- "head is 1"
