型と型クラス
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は引数に値をとってデータを作るので、データコンストラクタなわけです。
何となくつながってきたように感じます。