機略戦記

Maneuver warfare

ruby使いがhaskellでhello word

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ならこ ういうジャンルに向いていそうである。