型と型クラス

9.2 代数的データ型

セレクタについて

C言語に慣れている私にとっては、フィールドラベル+セレクタの使い方が一番しっくり来ますね。
こんな感じ。

{--
  セレクタを使ってフィールド値を取得する。
--}
main = do print $ aSize  tagtag
          print $ aColor tagtag
          print $ aStr   tagtag

data Font = Font {aSize  :: Int,
                  aColor :: String,
                  aStr   :: String}

tagtag :: Font
tagtag = Font 14 "red" "This is font tag."
フィールドの更新について

Haskellには(再)代入がないので、変数の値を後から書き換えることは出来ません。
なので、あるフィールドの値だけを変えたコピーを作るわけです。
こんな感じ。

main = do print $ aSize  tagtag
          print $ aColor tagtag
          print $ aStr   tagtag
          print $ aStr   (tagtag {aStr = "This is a copy."})

data Font = Font {aSize  :: Int,
                  aColor :: String,
                  aStr   :: String}
型コンストラクタと型名とデータコンストラクタについて

型コンストラクタが型名と同じであるとはじめ聞いたとき、
なぜこの二つの概念が分けられているのか理解出来ませんでした。
でもこの違いは多相型を作るときに意味を持ってくるんですね。
型コンストラクタと型名の違いが分かる例を。

main = do print $ data1 hogehoge
          print $ data2 hogehoge

data DataT a b = Data {data1 :: a,
                       data2 :: b}

hogehoge :: DataT String String
hogehoge = Data "hogehoge1" "hogehoge2"


上の例では、DataTが型コンストラクタで、DataT a bが多相型の型名なわけです。
ちなみにDataT String Stringは具体化された型名…かな?
いずれにせよ、DataTとDataT a bやDataT String Stringは異なるものです。


確かに型コンストラクタは型を作るためのものですね。
型を引数にとって、新たな型を作るもの。コンストラクタそのものですね。
そのコンストラクタによって作られるものが型です。
ちなみに上の例でいうとDataは引数に値をとってデータを作るので、データコンストラクタなわけです。


何となくつながってきたように感じます。