Haskell入門 5ステップ

From HaskellWiki
Revision as of 16:28, 3 December 2009 by Ymotongpoo (talk | contribs)
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

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のチュートリアルや書籍があります。ここにいくつかおすすめを書いておきます。

チュートリアル

For a complete list of textbooks, references and tutorials:

コミュニティに参加しましょう!

いろんな人にHaskellコミュニティを紹介してください:

Languages: en