fugafuga.write

日々のログ



すごいH本 part36

新しいデータ型を自分で作る

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]

所感

型と値コンストラクタの違いがちょっとわかりにくい。CircleRectangleも型としてありそう。

すごいHaskellたのしく学ぼう!

すごいHaskellたのしく学ぼう!

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