パターンマッチ

前のページで、type キーワードを用いたカスタム型の書き方について学びました。 主要な例としてチャットルームの User 型を定義しました:

type User
  = Regular String Int
  | Visitor String

Regular ユーザーは名前と年齢を持っているのに対し、Visitor ユーザーは名前だけを持っているのでした。 このようにカスタム型の作り方は分かりましたが、実際にはどのように使えば良いのでしょうか?

case

User から表示する名前を返す関数 toName を定義したいとします。 case 式を使う必要があるでしょう:

toName : User -> String
toName user =
  case user of
    Regular name age ->
      name

    Visitor name ->
      name
-- toName (Regular "Thomas" 44) == "Thomas"
-- toName (Visitor "kate95")    == "kate95"

The case expression allows us to branch based on which variant we happen to see, so whether we see Thomas or Kate, we always know how to show their name.

そしてもし、toName (Visitar "kate95") や toName Anonymous のような不正な引数を与えた場合には、コンパイラがそのことについてすぐに教えてくれるでしょう。 つまり、多くの単純なミスは、あまり時間をかけなくても、数秒で修正できるでしょう。

Wild Cards

The toName function we just defined works great, but notice that the age is not used in the implementation? When some of the associated data is unused, it is common to use a “wild card” instead of giving it a name:

toName : User -> String
toName user =
  case user of
    Regular name _ ->
      name

    Visitor name ->
      name

The _ acknowledges the data there, but also saying explicitly that nobody is using it.

results matching ""

    No results matching ""