新しいデータ型を自分で作る
data
キーワードを使う。
標準ライブラリでのBool型の定義
data Bool = False | True
等号の前が型の名前、等号の後が値コンストラクタ
値コンストラクタは、型が取り得る値の種類のこと。
長方形と円の図形を型として表現する。
data Shape = Circle Float Float Float | Rectangle Float Float Float Float
Circle
は円の中心の座標と円の半径を受けるRectangle
は最初2つは左下の角、残りは右上の角の座標を受ける
値コンストラクタの型シグネチャを確認する
Prelude> :t Circle Circle :: Float -> Float -> Float -> Shape Prelude> :t Rectangle Rectangle :: Float -> Float -> Float -> Float -> Shape
どちらともShape
を返す関数となっている。
Shape を引数にとって、その面積を返す関数を書く。
data Shape = Circle Float Float Float | Rectangle Float Float Float 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 10 <interactive>:22:1: error: • No instance for (Show Shape) arising from a use of ‘print’ • In a stmt of an interactive GHCi command: print it
これはShape
型を文字列にして表示できないため。
表示できるようにするにはこうする
data Shape = Circle Float Float Float | Rectangle Float Float Float Float deriving (Show)
表示する
*Main> Circle 10 20 10 Circle 10.0 20.0 10.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]
所感
型と値コンストラクタの違いがちょっとわかりにくい。Circle
とRectangle
も型としてありそう。

- 作者: MiranLipovaca
- 出版社/メーカー: オーム社
- 発売日: 2017/07/14
- メディア: Kindle版
- 購入: 4人 クリック: 9回
- この商品を含むブログを見る