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
何気なく無限リストを作ったが、エラーにならずに表示できる。
(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)