パタンマッチ

引数のパターンマッチ

Haskell では、関数の名前が同じで引数が違うものを複数定義できる。

次のスクリプトは、リストの値を順番に表示する。

[]は空リスト、[x..y]は、xからyまでの値を含むリスト。[1..]と書くと、1以上無限の値を含むリストになる。

関数fooをオーバーロードし、空リストのときは上の関数を実行し、そうでないときは下の関数を実行する。

x:xsの「:」は演算子で、最初の引数を二つ目の引数であるリストの前に加える。関数の引数としては、リストを先頭の値xと残りのリストxsに分ける。

showは値を文字列に変換する(表示用)。

main = putStrLn (foo [1..])

foo []     = ""
foo (x:xs) = (show x) ++ "\n" ++ foo xs

何気なく無限リストを作ったが、エラーにならずに表示できる。

ガード (guard)

(2005.9.3)

関数を定義するとき、引数のパターンマッチで書く以外に、条件式でどの定義を使うかを選択するようにできる。

次のサンプルは階乗を計算する。

factorial :: Integer -> Integer     -- 関数宣言

factorial 0 = 1
factorial n = n * factorial (n - 1)

main = putStr (show (factorial 10))

これは、次のようにも書ける。その他の場合の定義は、| otherwise = ... と書く。

factorial n 
  | n == 0 = 1
  | n > 0  = n * factorial (n - 1)