今回は Guard という,条件分岐をサクッと書ける書き方について.
en.wikibooks の Haskell より. CC-BY-SA での配布です.
Guards
絶対値を吐く関数を書いてみましょう.Haskell にabs 関数があるので自分で書かなくてもいいんですが.書きたいのは,数式で書くと
|x| = x if x >= 0
-x if x < 0
ってこと.さて Haskell で書くでーーーー!
myabs x
| x < 0 = 0 - x
| otherwise = x
大変読みやすくまとまっております.
- まず普通に書き始めて
=書かずに改行,インデントを置いて(これは文法上必要)場合分けを書く.- 場合分けは
|に続けて,Bool 値を返す expression,=とその場合の右辺の順. - それぞれが guard と呼ばれるらしいぜ!
- otherwise は otherwise. 別になくても構わない.さっきので言えば
x<=0で書いてもよかった.
けどどれも True にならなかったら runtime error になる(バグ取り大変)から使っといたほうがいい.
- 場合分けは
注意点.
-
otherwise格好いいけど実はotherwise = True
って定義されてるだけらしい.賢いな.でもだから最後に置かなあかんよ. -
わざわざ
0 - xって書いたけど,この場合は関数としてやなくてあくまで記法上の簡略化として-xとだけ書いてもよかった.ただ3 - -5みたいな書き方は括弧なしでは通らないので気をつけよう.
where and Guards
where と guard の組み合わせは使いやすい.二次方程式 ax^2 + bx + c = 0 の解の個数
numOfSolutions a b c
| disc > 0 = 2
| disc == 0 = 1
| otherwise = 0
where
disc = b^2 - 4*a*c
ここで where の scope は guard 全部の下に入ってるってことらしい.ということで今日はここまで.
No comments:
Post a Comment