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 }
>型をくるむのにdataキーワードを使うと、コンストラクタに包んだりほどいたりするたびにオーバーヘッドがかかります
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> _
再帰的な型定義ができる
hsdata List a
= Cons a (List a)
| Nil
!
を使うことで、正格評価にできる
hsdata Tuple a b = Tuple !a !b