Haskellクイックスタート

文:Nick Gibson(Builder AU)
翻訳校正:原井彰弘
2007/12/13 10:00

Haskellのような関数型言語は難しいと感じるかもしれない。今回は、Haskellの簡単なクイックスタートを提供する。

module Builder where

fact 0 = 1
fact x = x * fact (x-1)

最初の行は、このファイルがBuilderという新しいモジュールを含んでいることを表している。このモジュールは、階乗の計算を行う関数のみを含んでいる(階乗の関数は、再帰関数を示すときによく用いられる例である)。ところで、この関数には2つの定義がある。1つ目の定義は0の階乗が1であることを示し、2つ目の定義では、0以外の値xの階乗は、(x - 1)を引数として呼び出したfactの戻り値をx倍したものであることを示している。

このモジュールをGHCi内でロードするには、ファイルを保存した上で、次のようなコマンドを入力する必要がある。

Prelude> :l Builder.hs
[1 of 1] Compiling Builder          ( Builder.hs, interpreted )
Ok, modules loaded: Builder.
*Builder> 

では、早速定義した関数を使ってみよう。

*Builder> fact 1
1
*Builder> fact 2
2
*Builder> fact 10
3628800
*Builder> fact 100
93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000
*Builder> fact (-2)
*** Exception: stack overflow

この関数は動作するが、どうやら負の値を扱えないという問題があるようだ。この問題を解決するために、値が正であれば一つずつ減らしていき、負であれば一つずつ加えていくという関数を考えてみる。

betterFact 0 = 1
betterFact x = x * betterFact (x `op` 1)
    where op = if x > 0 then (-) else (+)

この関数は以前のものよりも少し複雑で、いくつかの新しい概念を含んでいる。まず、一番最後の行では、where構文を用いてopという新しい変数を定義している。where構文を用いると、複雑なコードや共通するコードをその内容を説明する名前の変数で置換することが可能になるため、関数の見通しがよりよくなる。

このケースでは、変数opは関数である。つまり、if構文を用いて変数opにマイナスの関数(-)もしくはプラスの関数(+)を代入している。関数もオブジェクトそのものであるため、簡単に変数へ代入することが可能なのである。

最後に、この例では変数を接中辞(infix)関数として扱っている。これは、引数を算術演算子のように両側に書けるようにしたもので、2行目のようにバッククォートで変数を括ることによって実現できる。ここでは、もしxが正ならばbetterFactの次の引数としてはx - 1を用い、もしxが負ならばx + 1を用いるという意味になっている。

記事の感想やご意見をコメントでお寄せください(CNET_IDログインが必要です)
ログイン パスワードを忘れた方  |  新規登録
米フォレスター・リサーチ社 シニアアナリスト Jeremiah K.Owyang氏を迎え、同氏が提唱するソーシャルテクノロジーを効果的に活用方法するための方法『POST』を日本で初めて紹介する注目のリアルイベント
  • 新着記事
  • 人気記事
  • 特集
  • ブログ