トラック
/
Haskell
Haskell
/
シラバス
/
代数的データ型
代数

代数的データ型 の Haskell

1個の演習

代数的データ型について

代数的データ型(ADT)は、決まった数の名前付きケースを表します。 ADTの各値は、そのうち必ず1つのケースに対応します。

ADTはdataキーワードを使って定義し、ケースはパイプ(|)で区切ります。 どのケースにもデータが関連付けられていない場合、そのADTは、他の言語で通常_列挙型_(enum)と呼ばれるものに似ています。

data Season
  = Spring
  | Summer
  | Autumn
  | Winter

ADTの各ケースには、必要に応じてデータを関連付けることができ、ケースごとに異なる型のデータを持たせられます。データを関連付けるケースでは、コンストラクターが必要です。

data Number
  = NInt Int      --'NInt' is the constructor for an Int Number.
  | NFloat Float  --'NFloat' is the constructor for an Float Number.
  | Invalid       --'Invalid' does not have data associated to it.

特定のケースの値を作るには、その名前を参照します(例えばNInt 22)。 ケース名は単なるコンストラクター関数なので、関連付けるデータは通常の関数の引数として渡せます。

ADTは_構造的等価性_を持ちます。つまり、同じケースで同じ(省略可能な)データを持つ2つの値は等価です。

if/else式を使ってADTを扱うこともできますが、推奨される方法は、_case_文を使ったパターンマッチングです。

add1 :: Number -> String
add1 number =
    case number of
      NInt    i -> show (i + 1)
      NFloat  f -> show (f + 1.0)
      Invalid   -> error "Invalid input"
GitHubで編集 リンクは新しいウィンドウまたはタブで開きます