ようこそ。睡眠不足なプログラマのチラ裏です。

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 型コンストラクタ = データコンストラクタ 型12 ‥‥


データコンストラクタと関数の違い
データコンストラクタは関数に似ているけど関数ではない。
まず、関数は常に引数をとるが、データコンストラクタは引数がないことがある。
(たとえば列挙型スタイルの代数的データ型は引数をとらない)
また、データコンストラクタは「これ以上簡約できない」けど、関数は「まだ簡約できる」という違いがある。


久々の更新だが、だるいので今日はここまで。