Hatena::Grouphaskell

lnzntのHaskell日記 このページをアンテナに追加 RSSフィード

2011年07月27日(水)

Haskell のコンパイラとインタプリタ

| 12:12 |  Haskell のコンパイラとインタプリタ - lnzntのHaskell日記 を含むブックマーク はてなブックマーク -  Haskell のコンパイラとインタプリタ - lnzntのHaskell日記  Haskell のコンパイラとインタプリタ - lnzntのHaskell日記 のブックマークコメント

Haskell の学習を再開します。


忘れてしまったので復習です。まずは処理系。

GHC
Glasgow Haskell Compiler。コンパイラの定番*1
HUGS
インタプリタの定番*2。Haskell98 仕様*3


以下は 5 の階乗を求めるプログラム。fac.hs*4

fac 0 = 1
fac n = n * fac (n-1)

main = print (fac 5)

コンパイルする。オプションは cc ライク。

$ ghc -o fac fac.hs

実行可能ファイル fac ができるので実行してみる。

$ ./fac
120

Makefile を作っておく。

% : %.hs
    ghc -o $@ $<

これで、

$ make fac

で(ソースが更新されていれば)fac がリコンパイルされる。

Ubuntu には hmake というHaskell 用 make のようなパッケージがあった。

インストールして試した。

$ touch fac.hs
$ hmake fac
ghc      -c  -o fac.o fac.hs
ghc      -o fac fac.o 

こっちがよさそう。(Makefile のようなものは要りません)


hugs を試す。

$ hugs
__   __ __  __  ____   ___      _________________________________________
||   || ||  || ||  || ||__      Hugs 98: Based on the Haskell 98 standard
||___|| ||__|| ||__||  __||     Copyright (c) 1994-2005
||---||         ___||           World Wide Web: http://haskell.org/hugs
||   ||                         Bugs: http://hackage.haskell.org/trac/hugs
||   || Version: September 2006 _________________________________________

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

Type :? for help
Hugs>

husg は起動すると標準ライブラリの Prelude.hs *5 をロードして、標準的な関数を使用できるようにする。

hugs では関数定義ができないらしい。プログラム(のソース)をロードして*6使う。

Hugs> :l fac.hs
Main> fac 5
120

できた。(^_^)


GHC 付属のインタプリタ ghci では let を使って関数を定義できる。

Prelude> let double x = x * x
Prelude> double 10
100


*1Ubuntu では ghc6 パッケージ。ghci というインタプリタも付属

*2Ubuntu では hugs パッケージ

*3Haskell の(多分)メジャーな言語仕様。最新仕様は Haskell 2010

*4Haskell の拡張子は .hs

*5:プレリュードと呼ばれる

*6:ロードは :load コマンド。:l と略せる。リロードは :reload