by shigemk2

当面は技術的なことしか書かない

値コンストラクタ

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.15927

Main> area $ Rectangle 0 0 100 100
10000.0

Main> 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 it

Main> :r
[1 of 1] Compiling Main ( baby7.hs, interpreted )
Ok, modules loaded: Main.

Main> Circle 10 20 5
Circle 10.0 20.0 5.0

Main> Rectangle 50 230 60 90
Rectangle 50.0 230.0 60.0 90.0

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]