Haskell 始めてみる(03)

型構築子 / データ構築子

A Gentle Introduction to Haskell: Values and Typesより。

Haskellではdata 宣言を使って、ユーザ自身が型を定義することができます。

data Bool               = False | True 

Bool は(無引数) 型構築子の例です。また、TrueFalse は(無引数)データ構築子の例です。
同じようにして、色の型を定義しましょう。

data Color              = Red | Green | Blue | Indigo | Violet 

だそうである。
data 宣言の左辺に出てくるのが型構築子で、右辺に出てくるのがデータ構築子ということでいいですかね。右辺のデータ構築子に実引数を渡してやると(この場合は無引数)、Color 型の値になる。

一見すると、Bool や、Color の定義をやってるように見える。
すると当然、右辺に出てくるFalseTrueRedGreen... たちは、どこで定義されてるのかと疑問に思うわけですが、そんな説明は全然無い。


説明がないのであきらめて、ghci で確認してみました。

Prelude> :l type.hs 
Compiling Main             ( type.hs, interpreted )
Ok, modules loaded: Main.

何のエラーも無くload できました。あー、合ってるんだなぁ。釈然としない。
すっきりしないながらも、ふと、試しに Color 型の値を作ってみようと思いたった。

color = Red

…こう書かざるを得ない。Red の定義が無く、一体なんなのかわからないのに、これで Color 型ができてしまう。
と、Color 型の値を作った瞬間、わかった気がした。
data 宣言は、左辺の型構築子を定義しているというよりは、型構築子とデータ構築子の「関係」を定義していると思えばよくて、それぞれが「何」なのかは気にしないでよいと思えばいいんじゃないか?
その解釈で改めてdata 宣言を読むと、

data Color = Red | Green | Blue

超訳

Color 型の値を作りたきゃ、c = Red と書くか c = Green と書くか c = Blue と書け。
逆に言うと、 c = Red とか c = Green とか c = Blue と書くと、c の型は Color になってしまうぞ。

となる。
うん。個人的にはこれですっきりした。

多分続く。