29 June, 2006

[Haskell] Guards, if-then-else, and Case Expression

Haskell 学習メモ: Boolean Guard, Case Expression, Conditional Expressionより。


sign1 :: Int -> Int
sign1 x | x > 0 = 1
| x == 0 = 0
| otherwise = -1

-- 真となるガードがない場合、次の等式へ。
sign2 :: Int -> Int
sign2 x | x > 0 = 1
| x == 0 = 0
sign2 _ = -1

sign3 :: Int -> Int
sign3 x = case (x > 0) of
True -> 1
False -> case (x == 0) of
True -> 0
False -> -1

sign4 :: Int -> Int
sign4 x = if (x > 0) then 1
else if (x == 0) then 0
else -1


次の演習問題用にGuardをネストして書きたい場合はどうすれば良いのだろうと思って探していたら見つけた。
当たり前だが、caseとかifで書けばいいのか。

あと、3. 関数を定義するHaskell のお勉強でも同様の書き方を学べる。
こちらでは、

shot_putting1 v0 angle = vx * t
where r = angle * pi / 180.0
vx = v0 * cos r
vy = v0 * sin r
t = 2 * vy / 9.8

と、補助関数(これが普通の言語なら補助のlocal変数と思うところだが)という書き方も見つけた。便利。
このサイトの他の記事も、最小二乗法とか探索の書き方とか、勉強になる。

No comments: