Haskellのdata
代数的データ型を用いて新たな型を定義する
元の型とは全くの別物になる
0以上の任意個数のフィールドを持てる
code:hs
data Bool = True | False -- 値コンストラクタは2つ
data Circle = Circle Float Float Float -- 1つ
data Void -- 0つ
data Person = { name::String, age::Int }
型をくるむのにdataキーワードを使うと、コンストラクタに包んだりほどいたりするたびにオーバーヘッドがかかります すごいH本.icon p.259
そのため、値コンストラクタとそのfieldが1つの時は、newtypeで定義すべき
fieldはdefaultで遅延評価になる
code: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> _
再帰的な型定義ができる
code:hs
data List a
= Cons a (List a)
| Nil
!を使うことで、正格評価にできる
code:hs
data Tuple a b = Tuple !a !b