Wednesday 7 August 2013

Haskell 入門! (7)

Haskell 入門企画.
今回は 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