第2章GHCiを使う

目次

2.1. GHCiの紹介
2.2. ソースファイルをロードする
2.2.1. モジュールとファイル名
2.2.2. ソースコードの変更と再コンパイル
2.3. コンパイル済みコードをロードする
2.4. プロンプトで対話的に評価する
2.4.1. I/O動作とプロンプト
2.4.2. プロンプトでdo記法を使う
2.4.3. プロンプトで実際にスコープにあるのは何か
2.4.3.1. :module:load
2.4.3.2. 修飾名
2.4.3.3. :mainコマンドと:runコマンド
2.4.4. itという変数
2.4.5. GHCiにおける型のデフォルト化
2.5. GHCiデバッガ
2.5.1. ブレークポイントと変数内容の表示
2.5.1.1. ブレークポイントを設定する
2.5.1.2. ブレークポイントを一覧・削除する
2.5.2. ステップ実行
2.5.3. ブレークポイントのネスト
2.5.4. _resultという変数
2.5.5. 追跡と履歴
2.5.6. 例外をデバッグする
2.5.7. 例: 関数を調べる
2.5.8. 制約
2.6. GHCiを起動する
2.6.1. パッケージ
2.6.2. 追加のライブラリ
2.7. GHCiのコマンド群
2.8. :setコマンド
2.8.1. GHCiオプション
2.8.2. GHCiからGHCのコマンド行オプションを設定する
2.9. .ghciファイル
2.10. GHCi内でオブジェクトコードにコンパイルする
2.11. FAQと注意事項

GHCi[1]はGHCの対話環境であり、Haskellの式を対話的に評価したりプログラムを解釈実行したりできる。もしあなたがHugsに慣れ親しんでいるなら、GHCiの扱いにもすぐに慣れるだろう。しかしながら、GHCiはコンパイル済みコードをロードすることができ、また、GHCが提供する言語拡張の全て[2]をサポートする。また、GHCiには対話的デバッガが含まれている。(2.5. GHCiデバッガを見よ)

GHCiの紹介

GHCiセッションの例を見ていくことから始めよう。GHCiはghciコマンドで起動することができる。

$ ghci
GHCi, version 6.12.1: http://www.haskell.org/ghc/  :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
Loading package ffi-1.0 ... linking ... done.
Prelude>

GHCiがプレリュードと標準ライブラリをロードするのに少し時間が掛かるかもしれない。その後、プロンプトが表示される。バナーにある通り、:?と打ち込めば利用可能なコマンド一覧と、それぞれの短い説明が得られる。

これらのコマンドの大部分はこれから説明する。Hugsの利用者へ: 多くのことがHugsと同じように動作するので、すぐに使えるようになるはずである。

プロンプトでは、Haskellの式を入力することができる。

Prelude> 1+2
3
Prelude> let x = 42 in x / 9
4.666666666666667
Prelude>

GHCiは行全体を一つの式だと解釈し、それを評価する。式は複数の行に渡っていてはいけない。エンターキーが押されると、GHCiは即座にそれを評価しようとする。

GHCiには複数行モードもあり、これは空行で終了する。次のように。

Prelude> :set +m
Prelude> let x = 42 in x / 9
Prelude|
4.666666666666667
Prelude>

Haskellでは、let式にはinが続く。しかし、GHCiでは、式はIOモナドの中でも解釈され得るので、付属するin文のないlet束縛は、上の例のように空行を使うことで示すことができる。

複数行モードは、モナドなdo文を複数入力するのに便利である。

Control.Monad.State> flip evalStateT 0 $ do
Control.Monad.State| i <- get
Control.Monad.State| lift $ do
Control.Monad.State|   putStrLn "Hello World!"
Control.Monad.State|   print i
Control.Monad.State|
"Hello World!"
0
Control.Monad.State>

ユーザは、複数行の対話の途中で中断してトップレベルプロンプトに戻ることができる。

Prelude> do
Prelude| putStrLn "Hello, World!"
Prelude| ^C
Prelude>
[1]

「i」はinteractiveのiである

[2]

ただし、現在のところ、foreign exportを除く