実例によるPureScript 5 章
パターン照合の章である。使いこなせれば強力なのは理解できる。記法が慣れないのは書いて覚えるしかないか。
factorial :: Int -> Int
factorial 0 = 1
factorial n = n * factorial (n - 1)
pascalsRule :: Int -> Int -> Int
pascalsRule 0 _ = 1
pascalsRule _ 0 = 1
pascalsRule n r | n == r = 1
| otherwise = pascalsRule (n - 1) (r - 1) + pascalsRule (n - 1) r
$${_0C_r (r > 0)}$$ で 1 を返すのはいいのか…
sameCity :: Person -> Person -> Boolean
sameCity { address: { city: c1 } } { address: { city: c2 } } = c1 == c2
-- sameCity _ _ = false この行は不要
なんと答えたらいいのかちょっとよくわからんのでとりあえず型を調べた。`showPerson` もだが、PSCi の出力がちょっと違う。なんとなく雰囲気的に任意となっている箇所はわかる。
> :t showPerson
forall (t14 :: Row Type).
{ first :: String
, last :: String
| t14
}
-> String
> :t livesInLA
forall (t45 :: Row Type) (t48 :: Row Type).
{ address :: { city :: String
| t48
}
| t45
}
-> Boolean
> :t sameCity
forall (t24 :: Row Type) (t27 :: Row Type) (t30 :: Row Type) (t33 :: Row Type) (a35 :: Type).
Eq a35 => { address :: { city :: a35
| t27
}
| t24
}
-> { address :: { city :: a35
| t33
}
| t30
}
-> Boolean
fromSingleton :: forall a. a -> Array a -> a
fromSingleton _ [s] = s
fromSingleton default _ = default
exampleCircle :: Shape
exampleCircle = Circle { x: 0.0, y: 0.0 } 10.0
中心も原点から 2 倍に遠ざけるようにした。
scaleByTwo :: Shape -> Shape
scaleByTwo (Circle { x, y } r) = Circle { x: x * 2.0, y: y * 2.0 } (r * 2.0)
scaleByTwo (Rectangle { x, y } w h) = Rectangle { x: x * 2.0, y: y * 2.0 } (w * 2.0) (h * 2.0)
scaleByTwo (Line { x: x1, y: y1 } { x: x2, y: y2 }) = Line { x: x1 * 2.0, y: y1 * 2.0 } { x: x2 * 2.0, y: y2 * 2.0 }
scaleByTwo (Text { x, y } s) = Text { x: x * 2.0, y: y * 2.0 } s
-- scaleByTwo (Clipped s p) = Clipped (scaleByTwo s) (map scaleByTwo p)
getString :: Shape -> Maybe String
getString (Text _ s) = Just s
getString _ = Nothing
area :: Shape -> Number
area (Circle _ r) = Number.pi * r * r
area (Rectangle _ w h) = w * h
area (Line _ _) = 0.0
area (Text _ _) = 0.0
-- area (Clipped _ _) = 0.0 -- Not implemented.
data Shape
= Circle Point Number
| Rectangle Point Number Number
| Line Point Point
| Text Point String
| Clipped Shape Picture
と拡張し、
shapeBounds (Clipped shape pict) = clipped
where
pictBounds = bounds pict
sBounds = shapeBounds shape
clipped = intersect sBounds pictBounds
とした。ビルドするには showShape や getCenter なども手を入れる必要がある。
この記事が気に入ったらサポートをしてみませんか?