Yet Another Haskell 3章 (5)
3.5 Functions
関数に関して
関数の定義
関数の定義は、関数名 引数 = 式 の形で書く。
例えば、ある数を2乗する関数は次のように書ける。
square x = x * x
if then else
条件分岐はif then elseを使って書ける。
例えば、
signum x = if x < 0 then -1 else if x > 0 then 1 else 0
case of
C言語等にあるswitch文に相当するものはcase ofを使って書ける。
f x = case x of 0 -> 1 1 -> 5 2 -> 2 _ -> -1
ここで、関数fは引数xが、0のときは1を、1のときは5を、2のときは2を、それ以外の場合は、-1を返す関数となる。
_はワイルドカードである。
インデント
case ofの例では、インデントが重要である。
Haskellでは、Pythonのように、インデントを使うことで{}を省略することができる。
一般的には、where, let, do, ofの後に、{が挿入され、次のコマンドの現れる位置が記憶される。
その後、同じインデントの行が現れる度に、;が挿入され、インデントが少なくなった位置で、}が挿入される。
一般的な書き方をしている限り、この規則は特に覚えなくてもよい。
関数fの定義は次と同等になる。
f x = case x of { 0 -> 1 ; 1 -> 5 ; 2 -> 2 ; _ -> 1 }
関数の分割定義
関数は、分割して定義できる。関数fは次のようにも定義できる。
f 0 = 1 f 1 = 5 f 2 = 2 f _ = -1
f _ = -1が最後にあることは重要である。この行を最初にもってくると、任意の値に対してfは-1を返すようになってします。
分割して定義された関数はcase ofを使ったものと同等であり、分割して定義されたものはcase ofを使ったものに置き換えられる。
関数の合成
2つの関数を.を使うことで合成できる。
square (f 2)
と
(square . f) 2
と書ける。
(.の前後のスペースは無くても大丈夫だった。)
幾つかの関数
id: 恒等関数 id x = x
null: リストが空ならTrueを返す。
==: 2つの値が等しければTrue
/=: 2つの値が異なればTrue