haskellにちょっと興味が出てきた。 新しいコンセプトや考え方を学ぶのは面白い。
今日はhaskellでhello wordをしてみる。
環境構築
$ brew install ghc
brew
で簡単にインストールできた。
ちなみに環境はMac OSである。
ghcとはhaskellのコンパイラである。
他にもいくつかの処理系があるようだがどうやらこのghcというやつがスタンダードなようだ。
ghcにはGHCiというhaskellの対話的実行環境が付属してくる。
これはrubyで言うところのirbみたいなものだ。
gchi
コマンドで起動できる
$ ghci GHCi, version 7.8.3: http://www.haskell.org/ghc/ :? for help Loading package ghc-prim ... linking ... done. Loading package integer-gmp ... linking ... done. Loading package base ... linking ... done. Prelude>
hello worldをしてみる。
まだ特に驚くべき所は無い。
Prelude> print "hello world" "hello world"
次に進む前に、対話的実行環境では無く、 実行ファイルを生成してからコードを実行する方法を試してみる。
まずGHCiを終了させる。
Prelude> :quit Leaving GHCi.
:quit
でghciを終了できる。
:
で始まる文字列は、haskellのコードでは無く、ghciへのコマンドのようだ。
次に、先ほどのhello worldをファイルに書いてそこから実行してみる。
$ ghc -o hello_haskell hello_haskell.hs # コンパイル [1 of 1] Compiling Main ( hello_haskell.hs, hello_haskell.o ) Linking hello_haskell ... % ./hello_haskell # 実行 "hello haskell"
コンパイルして実行するのに、2回コマンドを打つ必要があり面倒である。
$ ghc -o hello_haskell hello_haskell.hs && ./hello_haskell "hello haskell"
とりあえず、このようにしている。
次に、よくhaskellのコードサンプルとして登場してくる階乗の計算
を実装してみる。
factorial 0 = 1 factorial n = n * factorial (n - 1) main = do print (factorial 5)
これは5の階乗を計算するhaskellのコードである。
注目した点が2つある。
パターンマッチ
factorial
というキーワードが1行目と2行目の先頭に登場している。
これは関数名であり、この2行は関数の定義を行っている。
なぜ同じ関数が2箇所に渡って定義されるのか?
このような書き方はパターンマッチと呼ばれる。
- もし、
factorial
の引数が0
であれば、1行目のfactorial
の処理が、 - もし、
factorial
の引数が上記の条件に当てはまらなければ、2行目のfactorial
が実行される
C++
などだと、引数の型が異なる同じ名前の関数を複数定義できるが、
この場合は、引数の値が異なる同じ名前の関数を複数定義している事になる。
繰り返し処理を再帰として表現
再帰自体はhaskellに限った機能では無い。
しかし、haskellのサンプルコードでは再帰が多用されているようである。
haskellが持つその他の特徴と再帰の相性が良いのかも知れない。
(まだ良く分からない)
とりあえず今回はここまで。
恐らくだが、この言語は数列に対する処理とか、数式の表現とかに向いていそうである。
例えば、金融商品の値動きデータは長さ無限の数列とみなす事もできるだろう。
遅延評価を備えていて、無限の数列を扱え、数式の表現にも強そうなhaskellならこ
ういうジャンルに向いていそうである。