Haskell入門 5ステップ
Haskellは汎用の純粋関数型プログラミング言語です。このページではなるべく早くHaskellが使えるようになるよう手助けとなる解説をします。
Haskellのインストール
他の多くのプログラミング言語と同様に、Haskellは2種類の方法で使うことができます。 一つバイナリ(コンパイラ)でもう一つはインタラクティブシェル(インタプリタ)です。 インタラクティブシェルでは式を試したり評価したりすることができます。 まずはインタラクティブシェルで始めるのがよいでしょう。
GHC | コンパイラとインタプリタ (GHCi) | おそらく最も多くの機能が実装されたシステム |
Hugs | インタプリタのみ | GHCより軽量でとてもお手軽 |
WindowsではGHCとHugsの両方が動作しますが、HugsのほうがよりWindowsとの親和性が高いと思われます。しかし、GHCが最も活発に開発やメンテナンスが行われているので、たいていの人は入門者はもちろん、プログラミングになれた人にもGHCを勧めます。またここにもMac OS XにHaskellをインストールする方法が載っています。
Haskell事始め
ターミナルを開いてください。もしGHCをインストール済みであれば、コマンドプロンプトに"ghci"と入力してください。(GHCインタプリタの実行ファイル名です)Hugsをインストール済みであれば"hugs"と入力してください。
$ ghci ___ ___ _ / _ \ /\ /\/ __(_) / /_\// /_/ / / | | GHC Interactive, version 6.4, for Haskell 98. / /_\\/ __ / /___| | http://www.haskell.org/ghc/ \____/\/ /_/\____/|_| Type :? for help. Loading package base-1.0 ... linking ... done. Prelude>
そしてプロンプトが表示されます。これでHaskellが起動し入力待ちの状態となりました。
初めてのHaskellプログラムを書いてみよう
他のプログラミング言語を学ぶ場合、まず最初に "Hello, world!" を書いたことと思います。なのでまずはそれをやってみましょう。
Prelude> "Hello, World!"
"Hello, World!"
Haskellは文字列を評価して、結果を表示しました。 今度は別の方法で標準出力に直接表示させてみましょう。
Prelude> putStrLn "Hello World"
Hello World
GHCのようなHaskellコンパイラを使って、コードをコンパイルしてスタンドアロンで動作する実行ファイルを作ることもできます。 次のようなコードを書いて、hello.hs として保存します。
main = putStrLn "Hello, World!"
そして次のようにしてコンパイルします。
$ ghc -o hello hello.hs
そして実行ファイルを走らせてみてください。(Unixでは./hello、Windowsではhello.exeを実行してください)
$ ./hello Hello, World!
電卓としてのHaskell
楽しいことをしてみましょう。Haskellでの真に最初のプログラムは階数を計算する関数です。再びインタプリタに戻って関数を定義してみましょう。
Prelude> let fac n = if n == 0 then 1 else n * fac (n-1)
これで整数の階数を計算する新しい関数 fac を定義しています。
fac にいくつか引数を与えて実行することができます。
Prelude> fac 42
1405006117752879898543142606244511569936384000000000
おめでとうございます! プログラミングによって一つ便利になりました。Hugsを使っている場合は、以下のようなコードを保存したファイル fac.hs から fac の定義を読み込む必要があるので気をつけてください。
fac n = if n == 0 then 1 else n * fac (n-1)
そしてHugsでは次のように実行します。(GHCでも同様にして動きます)
Hugs.Base> :load fac.hs
Main> fac 42
1405006117752879898543142606244511569936384000000000
もちろんこのプログラムをコンパイルしてスタンドアロンな実行ファイルを生成することもできます。fac.hs を次のように書いてみましょう。(今度はちょっとおもしろそうなので美しいパターンマッチの構文を使ってみましょう)
fac 0 = 1
fac n = n * fac (n-1)
main = print (fac 42)
そしてコンパイルして実行します。
$ ghc -o fac fac.hs $ ./fac 1405006117752879898543142606244511569936384000000000
すごい!
初めてのHaskell並列プログラミング
Haskellでは並列化/マルチコアプログラミングをサポートしています。式に `par` と付け加えることで、このように並列プログラムを書くことができます。
import Control.Parallel
main = a `par` b `par` c `pseq` print (a + b + c)
where
a = ack 3 10
b = fac 42
c = fib 34
fac 0 = 1
fac n = n * fac (n-1)
ack 0 n = n+1
ack m 0 = ack (m-1) 1
ack m n = ack (m-1) (ack m (n-1))
fib 0 = 0
fib 1 = 1
fib n = fib (n-1) + fib (n-2)
コンパイル時に -threaded と最適化オプションをつけます。
$ ghc -O2 --make A.hs -threaded [1 of 1] Compiling Main ( A.hs, A.o ) Linking A ...
これでマルチコアプログラムを動かすことができます。2コアの場合の例です。
$ time ./A +RTS -N2 1405006117752879898543142606244511569936384005711076 ./A +RTS -N2 2.14s user 0.02s system 149% cpu 1.449 total
おめでとうございます!これでマルチコアでのプログラミングもできてしまいましたね!
次にすることは?
たくさんのHaskellのチュートリアルや書籍があります。ここにいくつかおすすめを書いておきます。
チュートリアル
- 10分で学ぶHaskell
- Yet Another Haskell Tutorial (English)
- A Gentle Introduction to Haskell (English, File:GentleFR.pdf)
- Learn You A Haskell For Great Good!
書籍やチュートリアルのリストはここです:
コミュニティに参加しましょう!
いろんな人にHaskellコミュニティを紹介してください:
Languages: en