Haskellのお勉強 その12
代数的データ型とは
Haskellで新しい型を定義するには、data宣言を利用する。
data宣言で定義できる型のことを、「代数的データ型」と呼ぶ。
で、代数的データ型てなんやねん。なんのことだかさっぱりわからない。
代数的データ型ってのは様々な目的に使われるらしく、
それによって、代数的データ型とは何なのかが、わかり難くなってしまっているっぽい。
ということで、代数的データ型の使い方のスタイルを3つのスタイル、
「構造体スタイル」「列挙型スタイル」「共用体スタイル」に分類し、
それぞれのスタイルごとにどんな目的で代数的データ型が使われているのかを理解していく。
構造体スタイルの代数的データ型
複数の値をまとめるために代数的データ型を使う「構造体スタイル」のサンプルとして、次のような新しい型をdata宣言をしてみる。
data Anchor = A String String
これは、HTMLのアンカー(リンクを表すタグ)を表現するAnchor型を定義するdata宣言を表現している。
また、この宣言は、3つのことを同時に宣言している。
1つめは「Anchorという名前の新しい型を定義する」という宣言、
2つめは「その型を使って新しい値を作る方法は、『A』というデータコンストラクタを使う」という宣言、
最後に3つめは「その型のフィールドは2つあって、1つめのフィールドの型はString型、
2つめのフィールドの型はString型」という宣言をしている。
型コンストラクタ
上記例では、新しい型Anchorを「data Anchor」というふうに宣言しているが、この次に宣言している新しい型の名前「A」を型コンストラクタと言う。
この型コンストラクタは、アルファベット大文字で始まる識別子でないといけないらしい。
データコンストラクタ
上記例では、新しい型Anchorの定義内容を「data Anchor = A String String」としているが、「A String String」の一番最初の「A」は、Anchor型のデータコンストラクタという。
データコンストラクタは、関連付けられた型の値を作成するときに使われる識別子のことで
定義されたデータコンストラクタは、関数と同じように使うことができる。
もちろん関数合成や部分適用も使えるが、データコンストラクタは「関数ではない」ので注意。
一般に、構造体スタイルでの代数的データ型の宣言は、次のように書く。
data 型コンストラクタ = データコンストラクタ 型1 型2 ‥‥
データコンストラクタと関数の違い
データコンストラクタは関数に似ているけど関数ではない。まず、関数は常に引数をとるが、データコンストラクタは引数がないことがある。
(たとえば列挙型スタイルの代数的データ型は引数をとらない)
また、データコンストラクタは「これ以上簡約できない」けど、関数は「まだ簡約できる」という違いがある。
久々の更新だが、だるいので今日はここまで。