プログラミング勉強ログ

プログラミングの勉強記録

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