haskellでは、データ型を自作することが可能である。
例を見てみよう。
-- Circle側コンストラクタには、浮動小数を受け取るフィールドが3つある -- このように、値コンストラクタを書くときは後ろに型をつけたすことが出来、 -- これらは値コンストラクタに与える引数の型となる data Shape = Circle Float Float Float | Rectangle Float Float Float Float -- このままだとCircle 10 20 5を実行しても -- No instance for (Show Shape) -- なるエラーが返ってきてしまうので、 -- derivingを利用し、Show型クラスの一員にする deriving (Show) -- Shapeを取ってFloatを返す関数であると宣言している area :: Shape -> Float area (Circle _ _ r) = pi * r ^ 2 area (Rectangle x1 y1 x2 y2) = (abs $ x2 - x1) * (abs $ y2 - y1)
Main> area $ Circle 10 20 10
314.15927Main> area $ Rectangle 0 0 100 100
10000.0Main> Circle 10 20 5
:5:1:
No instance for (Show Shape)
arising from a use of `print'
Possible fix: add an instance declaration for (Show Shape)
In a stmt of an interactive GHCi command: print itMain> :r
[1 of 1] Compiling Main ( baby7.hs, interpreted )
Ok, modules loaded: Main.Main> Circle 10 20 5
Circle 10.0 20.0 5.0Main> Rectangle 50 230 60 90
Rectangle 50.0 230.0 60.0 90.0
- 値コンストラクタは関数なので、mapしたり部分適用が可能である
Main> map (Circle 10 20) [4,5,6,6]
[Circle 10.0 20.0 4.0,Circle 10.0 20.0 5.0,Circle 10.0 20.0 6.0,Circle 10.0 20.0 6.0]