すごkellp112の「形づくる」のあたり。
※ページ進んだとおもいきや戻ってという読み方をしているので一向に進みません。
テキスト読みながらぼんやり書いてぼんやり動かして、数日うまくいかないことがありました。
さっき解決したのでメモ。
円と矩形の定義をして、面積を得る関数を書きましょうみたいなあたり。
1
2
3
4
5
6
| data Shape = Circle Float Float Float |
Square Float Float Float Float
deriving (Show, Read)
area (Circle _ _ r ) = pi * r ^ 2
area (Square _ _ w h) = w * h
|
piは予約語なんだな。
こう書いて、
1
2
| *Main> area $ Circle 10 10 10
314.15927
|
うん。
1
2
| *Main> area $ Square 10 10 10 10
*** Exception: shape.hs:5:1-39: Non-exhaustive patterns in function area
|
えー。
dataの宣言のところの改行が良くないのだろうかとか、インデントの位置だろうかとか、そらもういろいろ試したがここから数日間動けず、イライラしておりました。
Circleの面積は得られる。
Squareは得られない。Squareが予約語なのかも!とかで書き換えてみてもダメで、ああそうだ、なんか型の宣言を書いといたほうがいいみたいな話だったなあと思い、
1
2
3
4
5
6
7
| data Shape = Circle Float Float Float |
Square Float Float Float Float
deriving (Show, Read)
area :: Shape -> Float
area (Circle _ _ r ) = pi * r ^ 2
area (Square _ _ w h) = w * h
|
1行書き足し。
これがじつは正解で、
1
2
| *Main> area $ Square 10 10 10 10
100.0
|
うごいた。
本には「型宣言を書いておくことはよい習慣です」くらいの書き方してたけど、違うじゃん。
必須じゃん。