generated at
Haskellのdata
代数的データ型を用いて新たな型を定義する
元の型とは全くの別物になる

値コンストラクタは複数あって良い
0以上の任意個数のフィールドを持てる
hs
data Bool = True | False -- 値コンストラクタは2つ data Circle = Circle Float Float Float -- 1つ data Void -- 0つ data Person = { name::String, age::Int }
パフォーマンス的にはHaskellのnewtypeに劣る
>型をくるむのにdataキーワードを使うと、コンストラクタに包んだりほどいたりするたびにオーバーヘッドがかかります すごいH本 p.259
そのため、値コンストラクタとそのfieldが1つの時は、 newtype で定義すべき


fieldはdefaultで遅延評価になる
ghci(hs)
ghci> data D = D Int ghci> let d = D (1+1) ghci> :sprint d d = <D> _ ghci> seq d () () ghci> :sprint d d = <D> _
再帰的な型定義ができる
hs
data List a = Cons a (List a) | Nil
! を使うことで、正格評価にできる
hs
data Tuple a b = Tuple !a !b