HOME Haskell のお勉強 書き込む

2. プログラムを動かす


この文章では Haskell プログラムを実行する手順を紹介します。

1. Haskell プログラムの書式

Haskell のプログラムには通常の書式と、コメントとコードが入れ替わった リテラル形式の2つがあります。通常の書式のファイルの拡張子は *.hs リテラル形式の拡張子は *.lhs として区別します。区別しないと 処理系が混乱して、文句を言ってきます。

1.1. 通常の書式

通常の書式は以下の通りです。
01:     -- Say hello
02:     module Main where
03:     import System
04:     
05:     main = do av <- getArgs
06:               putStrLn $ "Hi, " ++ (av !! 0) ++"!"
図1:hi.hs

1.2. リテラル形式

1.2.1. LaTeX モード

\begin{code}\end{code} に挟まれた部分がコードでそれ以外はコメントです。上の例を LaTeX モードで書くと以下のようになります。
01:     #! usr/bin/env runhugs
02:     
03:     \begin{code}
04:     
05:     module Main where
06:     import System
07:     
08:     main = do av <- getArgs
09:               putStrLn $ "Hi, " ++ (av !! 0) ++ "!"
10:               
11:     \end{code}
図2:hi.lhs

1 行目はスクリプトを実行ファイルにするとき呼び出すインタープリターを指定します。 (Perl, Python, Ruby と同様)

1.2.1. Bird モード

行頭に > がある行が コードでそれ以外はコメントです。上の例を Bird モードで書くと以下のようになります。
01:     #! usr/bin/env runhugs
02:     
03:     
04:     >module Main where
05:     >import System
06:     
07:     >main = do av <- getArgs
08:     >          putStrLn $ "Hi, " ++ (av !! 0) ++ "!"
09:               
10:     
図3:hi2.lhs

2. 処理系のインストールと動作確認

Haskell には2つのメジャーな処理系があります。 1つはインタープリターの Hugs で、もう1つはコンパイラーの GHC です。 対話的に使った場合、 Hugs の方がレスポンスが速いです。 一方、実行速度は GHC でコンパイルした方が勝ります。 従って、プログラムの開発、テストには、Hugs を使い、 出来上がったプログラムを GHC でコンパイルするのがよいと思います。

2.1. Hugs

Hugs は動作が軽快なインタープリターです。プロトタイプのテストなどに適しています。

2.1.1. インストール

Hugs は www.haskell.org/hugs/ からダウンロードできます。 ソースコードのほかに Windows, Linux 用バイナリーもあります。 バイナリーはウィザードに従って簡単にインストールできます。 無事にインストールすると hugs と runhugs とそれ以外の実行ファイルがインストール先に生成します。

2.1.2. hugs

hugs は対話的に関数を定義することが出来ないので、まず、ソースをファイルに保存して それをロードすることになります。hugs の主なコマンドは以下の通りです。その他のコマンド については :? で見てみてください。
コマンド 省略形 動作
:load file :l file file をロードする。
:reload :r 最後にロードしたファイルを再ロードする。
:quit :q hugs を終了する。
:? :? ヘルプを表示する。

例えば図4のコードを Qsort.hs という名前で保存し、図5のように hugs に打ち込むと、 リストをソートした結果が表示されます。

01:     module Qsort where
02:     
03:     qsort _ [] = []
04:     qsort f (x:xs) =  before ++ (x :  after)
05:      where before = qsort f $ filter (not . (f x)) xs 
06:            after  = qsort f $ filter (f x) xs
図4:Qsort.hs

D:\doc\05-03\haskell>hugs
__   __ __  __  ____   ___      _________________________________________
||   || ||  || ||  || ||__      Hugs 98: Based on the Haskell 98 standard
||___|| ||__|| ||__||  __||     Copyright (c) 1994-2003
||---||         ___||           World Wide Web: http://haskell.org/hugs
||   ||                         Report bugs to: hugs-bugs@haskell.org
||   || Version: Nov 2003       _________________________________________

Haskell 98 mode: Restart with command line option -98 to enable extensions

Type :? for help
Prelude> :l Qsort.hs
Qsort> qsort (<) [8,3,5,2,7,1,9]
[1,2,3,5,7,8,9]
Qsort>
図5:Qsort.hs を読み込んで実行。

2.1.3. runhugs

runhugs を使うとコンパイルしないでコードを実行できます。 ちょうど Perl, Python などのスクリプト言語のような使い勝手です。 例えば、図2の hi.lhs を実行するには、コマンドラインから図6のように打ち込みます。 hi.lhs を実行ファイルにすれば runhugs は省略できます。
D:\doc\05-03\haskell>runhugs hi.lhs Taro
Hi, Taro!

D:\doc\05-03\haskell>
図6:runhugs を使ったプログラムの実行。

2.2. GHC

Haskell の業界標準コンパイラーです。

2.2.1. インストール

GHC は www.haskell.org/ghc/ からダウンロードできます。 ソースコードのほかに Windows, Linux 用バイナリーもあります。 バイナリーはウィザードに従って簡単にインストールできます。 無事にインストールすると ghc とそれ以外の実行ファイルがインストール先に生成します。

2.2.2. コンパイルと実行

コマンドラインから、
D:\doc\05-03\haskell>ghc --make hi.hs -o hi.exe
とすると hi.exe が生成します。 --make としておけば複数のファイルも自動的にコンパイルしてリンクしてくれます。 あとは普通に実行するだけです。
D:\doc\05-03\haskell>hi Hanako
Hi, Hanako!
もし、ファイルサイズが気になるようでしたら strip してください。
D:\doc\05-03\haskell>strip hi.exe

3. リンク