型エイリアス

型注釈は時として長ったらしくなってしまうものです。例えば、フィールドがいくつもあるレコードを使っているような場合に実際に困ったことになります。主にこのような問題を解決するために、型エイリアスが存在します。型エイリアスとはある型につけた短い別名のことです。例えば、Userという型エイリアスを以下のように作成したりします。

type alias User =
  { name : String
  , age : Int
  }

毎度レコード型の内容を全部ズラーッと書かなくても、単にUserとだけ書けば良いのです。これを活用すれば、読みやすい型注釈を書けます。

-- WITH ALIAS

isOldEnoughToVote : User -> Bool
isOldEnoughToVote user =
  user.age >= 18


-- WITHOUT ALIAS

isOldEnoughToVote : { name : String, age : Int } -> Bool
isOldEnoughToVote user =
  user.age >= 18

上記の例はどちらも等価なものですが、型エイリアスを使っているものの方が型注釈が短く読みやすくなっています。このように、型エイリアスでやっているのは、そのまま書いたら長い型に対して別名(エイリアス)を作っているというだけのことです。

モデル

型エイリアスの典型的な使いみちとして、モデルを設計するときが挙げられます。The Elm Architectureについて学んだ際に、以下のようなモデルをあつかいました。

type alias Model =
  { name : String
  , password : String
  , passwordAgain : String
  }

このようなモデル型に対して型エイリアスを使うと、update関数やview関数の型注釈を書く際にとてもいいことがあります。全部フィールドを漏れなく書くのに比べて、Msg -> Model -> Modelと書くほうがずっといい感じです! 単に見た目がスッキリするだけでなく、モデルにフィールドを追加しても型注釈を全く変更しなくていいという別の嬉しさもあります。

レコードコンストラクター

レコード用に型エイリアスを作成すると、 レコードコンストラクターも一緒に生成されます。 つまりelm replUser型を定義したら、このようにレコードを作れます:

[ { "add-type": "User", "input": "type alias User = { name : String, age : Int }" }, { "input": "User", "value": "\u001b[36m<function>\u001b[0m", "type_": "String -> Int -> User" }, { "input": "User \"Sue\" 58", "value": "{ \u001b[37mname\u001b[0m = \u001b[93m\"Sue\"\u001b[0m, \u001b[37mage\u001b[0m = \u001b[95m58\u001b[0m }", "type_": "User" }, { "input": "User \"Tom\" 31", "value": "{ \u001b[37mname\u001b[0m = \u001b[93m\"Tom\"\u001b[0m, \u001b[37mage\u001b[0m = \u001b[95m31\u001b[0m }", "type_": "User" } ]

別のユーザーを作成したり、自分で型エイリアスを作ってみたりしてください⬆️

なお、レコードコンストラクターを使う際は、与える引数の順番が型エイリアスを定義したときのフィールドの順番と一致している必要があります。

念のため再度の確認ですが、これはレコードの場合に限った話です。レコード以外の型に対して型エイリアスを作っても、コンストラクターは作成されません。

results matching ""

    No results matching ""