From 3813e0fd298df408344c3b1c59eaa86d7cf5845c Mon Sep 17 00:00:00 2001 From: "m@kotha.net" Date: Tue, 22 Jul 2014 06:57:31 +0900 Subject: [PATCH] detab ghci.xml --- ghci.xml | 472 +++++++++++++++++++++++++++---------------------------- 1 file changed, 236 insertions(+), 236 deletions(-) diff --git a/ghci.xml b/ghci.xml index 2ab5873..ccd466b 100644 --- a/ghci.xml +++ b/ghci.xml @@ -260,14 +260,14 @@ Prelude> x <- return 42という文は、「return 42IOモナドの中で実行し、結果をxに束縛する」という意味である。以降、xを文の中で使う(例えば、上でしたように、値を印字する)ことができるようになる。 が設定されているなら、GHCiは次の場合に(そしてその場合に限り)、文の結果を印字する。 - - + + 文が束縛ではないか、ただ一つの変数を束縛するモナド束縛(p <- e)である。 - - + + 変数の型が多相的でなく、()でなく、Showのインスタンスである。 - - + + @@ -551,7 +551,7 @@ Prelude System.IO Map> - 修飾名 + 修飾名 手間をすこし省くことができるように、GHCiのプロンプトは、全てのパッケージの全てのモジュールと、現在GHCiにロードされている全てのモジュールについて、暗黙のimport qualified宣言があるかのように振る舞う。これはというフラグで無効にできる。 @@ -689,12 +689,12 @@ it <- e のようになる。しかし、利用者が型を指定しなければならないというのは面倒なので、GHCiはHaskellの型デフォルト化規則(Haskell 2010レポートの4.3.4節)を以下のように拡張している。標準の規則では、個々の型変数aについて制約の集まり(C1 a, C2 a, ..., Cn a)を考え、次の条件が満たされたとき、この型変数をデフォルト化する。 - 型変数aが他のどの制約にも現れない。 + 型変数aが他のどの制約にも現れない。 Ciが全て標準のクラスである。 Ciのうち、少なくとも一つが数値クラスである。 GHCiのプロンプトでは、あるいはGHCで-XExtendedDefaultRulesフラグが与えられている場合、以下の変更が適用される。 - + 上の規則2が次のように緩和される: Ci全て単引数の型クラスである。 上の規則3が次のように緩和される: Ciのうち、少なくとも一つが数値クラスであるか、Showであるか、Eqであるか、Ordである 単位型()が、型のデフォルト化の際に通常試す型のリストの先頭に追加される。 @@ -725,21 +725,21 @@ def = toEnum 0 例として、以下の特別な表示モジュールがあるとしよう。 - module SpecPrinter where - import System.IO + module SpecPrinter where + import System.IO - sprint a = putStrLn $ show a ++ "!" + sprint a = putStrLn $ show a ++ "!" 関数sprintは表示された値の最後に感嘆符を付ける。次のコマンドでGHCiを走らせると、 - ghci -interactive-print=SpecPrinter.sprinter SpecPrinter + ghci -interactive-print=SpecPrinter.sprinter SpecPrinter 対話セッションが開始され、そこでは値がsprintで表示される。 - *SpecPrinter> [1,2,3] - [1,2,3]! - *SpecPrinter> 42 - 42! + *SpecPrinter> [1,2,3] + [1,2,3]! + *SpecPrinter> 42 + 42! デフォルト以外の表示関数は、例えば、木構造や入れ子の構造をより読み易く表示するために使うことができる。 @@ -747,8 +747,8 @@ def = toEnum 0 -interactive-printフラグは、GHCを-eモードで走らせるときにも使える。 - % ghc -e "[1,2,3]" -interactive-print=SpecPrinter.sprint SpecPrinter - [1,2,3]! + % ghc -e "[1,2,3]" -interactive-print=SpecPrinter.sprint SpecPrinter + [1,2,3]! @@ -1225,9 +1225,9 @@ Just 20 ブレークポイントで停止したとき、既に評価中の変数を評価しようとすると、二番目の評価はハングする。この理由は、その変数が評価中であることをGHCが知っているため、新しい評価では、先に進む前にその結果を待つが、最初の評価はブレークポイントで停止しているのだから、もちろん結果は得られない、ということにある。評価がハングしたときはCtrl-Cで中断してプロンプトに戻ることができる。 これがもっともよく起こるのは、CAF(例えばmain)を評価していて、ブレークポイントで停止し、そのCAFの値を再びプロンプトで要求した場合である。 - + 暗黙パラメタ()がブレークポイントで利用できるのは、明示的な型シグネチャがある場合だけである。 - + @@ -1284,12 +1284,12 @@ $ ghci -lm .so形式の共有ライブラリを使うシステムでは、実際にロードされるライブラリはliblib.soである。GHCiは、ライブラリを探すとき、以下の場所をこの順で試す。 - + -Lpathコマンド行オプションで指定されたパス。 - - + + システムの標準ライブラリ探索パス。これは、システムによっては、LD_LIBRARY_PATH環境変数を設定することで変更できる。 - + .dll形式の共有ライブラリを使うシステムでは、実際にロードされるライブラリはlib.dllである。この場合も、ライブラリが見付からなかった場合はGHCiはエラーを報告する。 @@ -1312,51 +1312,51 @@ $ ghci -lm :abandon :abandon - - 実行中の評価を捨てる。(ブレークポイントでの停止中のみ有効) - + + 実行中の評価を捨てる。(ブレークポイントでの停止中のみ有効) + - + :add *module ... :add - + moduleを現在のターゲット集合に追加し、リロードを行う。通常、可能ならそのモジュールのコンパイル済みコードがロードされ、そうでなければそのモジュールはバイトコードにコンパイルされる。接頭辞*を使うことでモジュールがバイトコードとしてロードされることを強制できる。 - + - + :back :back - + 履歴中を一つ戻る。を見よ。:trace:history:forwardも参照。 - + - + :break [identifier | [module] line [column]] :break - + 指定された関数、または指定された行の指定された位置にブレークポイントを設定する。を見よ。 - + - + :browse! *module ... :browse - + moduleからエクスポートされている識別子を表示する。moduleは、GHCiにロードされているか、パッケージの要素でなければならない。moduleが省略された場合、直近にロードされたモジュールが使われる。 - GHCiのコマンド全てと同様に、出力はGHCiの現在のスコープ()で表示される。 + GHCiのコマンド全てと同様に、出力はGHCiの現在のスコープ()で表示される。 browseコマンドには二つの変種がある。 @@ -1386,31 +1386,31 @@ maybe :: b -> (a -> b) -> Maybe a -> b この出力が示すのは、現在のセッションの文脈(Preludeのスコープ)で、Data.Maybeの項目の最初の一団はスコープになく(ただしGHCiセッションでは完全修飾された形で利用できる。を見よ)、二番目の一団は(Preludeを介して)スコープにあり、修飾なし、あるいはPrelude.という修飾子付きの形式で利用できる、ということである。 - + - + - + :cd dir :cd - + 作業ディレクトリをdirに変更する。dirの先頭が「˜」記号の場合、それはHOME環境変数の内容で置き換えられる。現在の作業ディレクトリを表示することについては:show pathsコマンドも見よ。 注意: ディレクトリを変更すると、ロードされているモジュールは全て未ロードになる。これは、探索パスがふつう相対ディレクトリを使って表されており、また、セッションの途中で探索パスを変更することがサポートされていないためである。 - + - + :cmd expr :cmd - + exprIO String型の計算として実行し、その結果の文字列をGHCiコマンドのリストとして実行する。複数のコマンドは改行で区切る。:cmdコマンドは:defおよび:set stopと組み合わせて使うのに便利である。 - + @@ -1474,35 +1474,35 @@ Prelude> :complete repl 5-10 "map" - + :continue :continue - ブレークポイントで停止しているとき、実行中の評価を再開する。 - + ブレークポイントで停止しているとき、実行中の評価を再開する。 + - - :ctags filename - :etags filename - :etags - - :etags - - - + + :ctags filename + :etags filename + :etags + + :etags + + + Vi風のエディタ用(:ctags)またはEmacs風エディタ用(:etags)のタグファイルを生成する。ファイル名が指定されなかった場合は、それぞれデフォルトのtagsまたはTAGSが使われる。ロードされているモジュール内の全ての関数、構築子、型のタグが作られる。これらのコマンドが働くには、全てのモジュールが解釈実行されていなければならない。 - + - + :def! name expr :def - - :defは、GHCiにおいて新しいコマンド(マクロと言ってもいい)を定義するのに使われる。コマンド:def name exprは、新しいGHCiコマンド:nameを、Haskellの式exprで実装されたものとして定義する。式の型はString -> IO Stringでなければならない。:name argsがプロンプトに入力されると、GHCiは式(name args)を走らせ、結果のStringを受け取り、それをコマンドの列として再びGHCiに入力する。結果においては、隣り合うコマンドは「\n」で区切られていなければならない。 + + :defは、GHCiにおいて新しいコマンド(マクロと言ってもいい)を定義するのに使われる。コマンド:def name exprは、新しいGHCiコマンド:nameを、Haskellの式exprで実装されたものとして定義する。式の型はString -> IO Stringでなければならない。:name argsがプロンプトに入力されると、GHCiは式(name args)を走らせ、結果のStringを受け取り、それをコマンドの列として再びGHCiに入力する。結果においては、隣り合うコマンドは「\n」で区切られていなければならない。 これは少々ややこしいので、いくつか例を挙げる。まず、次に示す新しいGHCiコマンドは、引数を取らず、結果を生成せず、単に現在の日時を出力するだけのものである。 @@ -1537,103 +1537,103 @@ Prelude> :. cmds.ghci このコマンドの名前は:.であるが、これは「.」(同じことをするUnixシェルのコマンド)のアナロジーである。 :defと単独で入力すると、現在定義されているマクロの一覧を表示する。既に存在するコマンド名を再定義しようとすると失敗する。ただし:def!の形式が使われた場合は別で、この場合その名前の古いコマンドは黙って失われる。 - + - + :delete * | num ... :delete - + ブレークポイントを番号で指定して削除する。(それぞれのブレークポイントの番号を見るには:show breaksを使う)。*の形式では、ブレークポイントを全て削除する。 - + - + :edit file :edit - + エディタを開いて、file、それが省略されたときは直近にロードされたモジュールを編集する。起動されるエディタはEDITOR環境変数から採られるか、EDITORが設定されていないときはシステムのデフォルトエディタが使われる。使われるエディタは:set editorで変更することができる。 - + - + :etags - - :ctagsを見よ。 - + + :ctagsを見よ。 + - + :force identifier ... :force - + identifierの値を:printと同じ方法で表示する。:printと異なり、:forceは、値をたどっていく間に出会ったサンクを評価する。これによって、例外や無限ループが発生したり、別のブレークポイント(これは無視されるが、その旨表示される)に当ったりするかもしれない。 - + - + :forward :forward - - 履歴中で前進する。を見よ。:trace:history:backも参照。 - + + 履歴中で前進する。を見よ。:trace:history:backも参照。 + - + :help :help - + :? :? - + 利用可能なコマンドの一覧を表示する。 - + - + : : - - 前のコマンドを繰り返す。 - + + 前のコマンドを繰り返す。 + - + :history [num] :history - - 評価ステップの履歴を表示する。数値が与えられると、その数のステップを表示する(デフォルト: 20)。:traceと組み合わせて使う。を見よ。GHCiが保存する履歴の数を設定するにはを使う。 - + + 評価ステップの履歴を表示する。数値が与えられると、その数のステップを表示する(デフォルト: 20)。:traceと組み合わせて使う。を見よ。GHCiが保存する履歴の数を設定するにはを使う。 + - + :info!name ... :info - + 与えられた名前についての情報を表示する。例えば、もしnameがクラスなら、クラスメソッドとその型が印字される。もしnameが型構築子なら、その定義が印字される。もしnameが関数なら、その型が印字される。nameがソースファイルからロードされたものであった場合、GHCiはその定義のソースコード中の位置も表示する。 型およびクラスについては、それに言及するインスタンスもまとめて示す。無関係な情報を見せることがないように、インスタンスは、(a)その頭部がnameに言及している、かつ(b)そのインスタンスで言及されているものが全て:loadまたは:moduleコマンドの結果としてスコープにある(修飾されていてもそうでなくても良い)、場合にのみ表示される。 :info!コマンドも同様に動作するが、上記の制限(b)を外し、頭部がnameに言及するインスタンスでスコープにあるものを全て表示する。 - + @@ -1652,7 +1652,7 @@ Prelude> :. cmds.ghci type :kind - + typeの種を推論し、印字する。typeは任意の型式で、Either Intのような型構築子の部分適用であっても構わない。実際、:kindは、(通常許されない)型シノニムの部分適用を書くことも認めるので、以下が動作する。 ghci> type T a b = (a,b,a) @@ -1667,7 +1667,7 @@ T Int :: * -> * 省略可能な"!"を指定した場合、GHCはさらに、型シノニムを展開して型関数の適用を評価することによって型を正規化し、その結果を表示する。 - + @@ -1695,7 +1695,7 @@ T Int :: * -> * :load *module ... :load - + 指定されたmoduleとそれが依存するモジュールすべてを再帰的にロードする。ここで、個々のmoduleはモジュール名またはファイル名でなければならない。また、パッケージ中のモジュールの名前であってはいけない。 以前にロードされていたモジュールは、パッケージ中のものを除いて、忘れ去られる。この新しいモジュールの集合をターゲット集合と呼ぶ。:loadを引数なしで使うと、ロードされているモジュールや束縛を全て未ロードにできることに注意。 @@ -1704,22 +1704,22 @@ T Int :: * -> * :loadコマンドの後、以下のものが文脈として設定される。 - - + + moduleが成功裡にロードされたなら、module - - + + そうでないとき、今回の:loadでロードされたモジュールがあるなら、最後に成功裡にロードされたモジュール。 - - - そうでなければ、Prelude - - - + + + そうでなければ、Prelude + + + - + :main arg1 ... argn :main @@ -1765,113 +1765,113 @@ bar - + :module +|- *mod1 ... *modn :module import mod - + プロンプトに入力される文のための文脈を設定または改変する。import modの形式は:module +modと等価である。詳しくはを見よ。 - + - + :print names ... :print - + 評価を強制せずに値を表示する。:printは、型が不明、または部分的にしか分かっていない値に対して使うことができる。ブレークポイントにおける、多相型を持った局所変数がこれに当たる。:printは、実行時の値を調査しつつ、その値の型を再構築しようとし、可能ならGHCiの環境中でその型を精密にする。未評価の部分(サンク)に遭遇すると、:printは、それぞれのサンクに対して、_tで始まる名前の新しい変数を束縛する。さらなる情報はを見よ。:sprintコマンドも参照。これは:printと同様だが、新しい変数を束縛しない。 - + - + :quit :quit - + GHCiを終了する。プロンプトでCtrl-Dを打つことでも終了できる。 - + - + :reload :reload - + 現在のターゲット集合とそれらが依存するモジュールのうち、変更のあったものがあれば、ターゲット集合を再ロードしようと試みる。結果として、新しいモジュールがロードされたり、ターゲットから間接的に必要とされなくなったモジュールが外されたりするかもしれないことに注意せよ。 - + - + :run :run - - :mainを見よ。 - + + :mainを見よ。 + - + :script n - filename + filename :script - + ファイルの各行をGHCiコマンドとして実行する。このコマンドは、:set +mで設定される複数行モードと同時に使うことができる。 - + - + :set option... :set - + 色々なオプションを設定する。利用可能なオプションの一覧はを、GHCi固有のフラグはを見よ。:setコマンド単独では、どのオプションが現在有効になっているか表示する。また、現在の動的フラグの設定状況の一覧も表示する。GHCi固有のフラグは分けて表示される。 - + - + :set args arg ... :set args - + プログラムがSystem.getArgsgetArgsを呼んだときに返される引数のリストを設定する。 - + - + :set editor cmd - + :editコマンドで使われるエディタをcmdにする。 - + :set prog prog :set prog - + プログラムがSystem.getProgNamegetProgNameを呼んだときに返される文字列を設定する。 - + - + :set prompt prompt - + GHCiのプロンプトとして使われる文字列を設定する。promptの中では、%sという並びは現在スコープにあるモジュールの名前に置き換えられ、%lは現在のプロンプトの行番号(コンパイラメッセージで参照されるもの)に置き換えられ、%%%に置き換えられる。promptが"で始まる場合、HaskellのStringとしてパースされる。そうでない場合はそのまま文字列として扱われる。 @@ -1890,8 +1890,8 @@ bar :set stop [num] cmd - - ブレークポイントに当たったとき、または履歴中で新しい項目が選択されたときに実行されるコマンドを設定する。:set :stopの最も一般的な使われ方は、現在位置のソースコードを表示することである。例えば:set stop :listのようにする。 + + ブレークポイントに当たったとき、または履歴中で新しい項目が選択されたときに実行されるコマンドを設定する。:set :stopの最も一般的な使われ方は、現在位置のソースコードを表示することである。例えば:set stop :listのようにする。 コマンドの前に数値が与えられた場合、指定されたブレークポイント(だけ)に到達した場合に実行される。これは場合によって非常に便利である。例えば、:set stop 1 :continueとすると、ブレークポイント1に到達した場合必ず:continueが実行されるので、実質的にこのブレークポイントを無効化している。(但し、ブレークポイントに到達した場合のメッセージは出力される)。さらには、:def:cmdを巧妙に使って、:set stopで条件付きブレークポイントを実装することができる。 @@ -1899,15 +1899,15 @@ bar *Main> :set stop 0 :cond (x < 3) 同様の技法を使えば、指定した回数だけブレークポイントを無視することもできる。 - + - + :seti option... :seti - + :setと似ているが、:setiで設定されたオプションはプロンプトに入力された式とコマンドにのみ影響し、:loadでロードされたモジュールには影響しない(対照的に、:setで設定されたオプションはあらゆるところで適用される)。を見よ。 引数を与えなかった場合、プロンプトに入力される式とコマンドに適用されるオプションの集合を表示する。 @@ -1916,67 +1916,67 @@ bar - + :show bindings :show bindings - + プロンプトで導入された束縛と、その型を表示する。 - + - + :show breaks :show breaks - - 有効になっているブレークポイントの一覧を表示する。 - + + 有効になっているブレークポイントの一覧を表示する。 + - + :show context :show context - + ブレークポイントで停止している、継続中の評価の一覧を表示する。 - + - + :show imports :show imports - + importコマンドや:moduleコマンドによって作られ現在効力を持っているインポートを表示する。 - + - + :show modules :show modules - + 現在ロードされているモジュールの一覧を表示する。 - + - + :show packages :show packages - + 現在有効なパッケージフラグと、現在ロードされているパッケージの一覧を表示する。 - + - + :show paths :show paths @@ -2007,32 +2007,32 @@ bar - + :show [args|prog|prompt|editor|stop] :show - - 指定された設定を表示する(:setを見よ)。 - + + 指定された設定を表示する(:setを見よ)。 + - + :sprint :sprint - - 評価を強制せずに値を表示する。:sprint:printに似ているが、違いは、未評価の部分項が新しい変数に束縛されず、単に「_」と表されることである。 - + + 評価を強制せずに値を表示する。:sprint:printに似ているが、違いは、未評価の部分項が新しい変数に束縛されず、単に「_」と表されることである。 + - + :step expr :step 全てのブレークポイントを有効にして、式を単一ステップモードで評価開始する。このモードでは、簡約一回ごとに評価が停止し、局所変数を確認することができる。exprが与えられなかった場合、最後のブレークポイントから評価を再開する。を見よ。 - + @@ -2060,50 +2060,50 @@ bar :trace expr :trace - - 与えられた式を評価(式を与えられなかった場合は直近のブレークポイントから再開)するが、後で:historyで観察できるように評価ステップのログを残す。を見よ。 - + + 与えられた式を評価(式を与えられなかった場合は直近のブレークポイントから再開)するが、後で:historyで観察できるように評価ステップのログを残す。を見よ。 + - + :type expression :type - + expressionの型を推論し、印字する。多相型には明示的な全称量化が加えられる。推論に際して、単相性制限は適用されない。 - + - + :undef name :undef - + 利用者定義のコマンドnameを未定義にする。(上の:defを見よ) - + - + :unset option... :unset - + ある種のオプションを無効にする。利用可能なオプションの一覧は、を見よ。 - + - + :! command... :! shell commandsin GHCi - + シェルのコマンドcommandを実行する。 - + @@ -2129,49 +2129,49 @@ bar 利用できるGHCiオプションは以下のものである。 - - + + +m +m - - 複数行コマンドのパースを有効にする。複数行コマンドは、現在の行が閉じていないレイアウト文脈を含んでいる場合に受け付けられる(を見よ)。 - - + + 複数行コマンドのパースを有効にする。複数行コマンドは、現在の行が閉じていないレイアウト文脈を含んでいる場合に受け付けられる(を見よ)。 + + - - + + +r +r CAFsin GHCi Constant Applicative FormCAFs - + 通常、ロードされたモジュールにあるトップレベルの式(CAF(Constant Applicative Form)、あるいは定作用形とも呼ばれる)を評価した結果は、複数回のプロンプトでの評価をまたがって保持される。+rを有効にすると、トップレベルの式の評価結果はすべて、一回の評価が終わるごとに捨てられるようになる(それでも一回の評価の間は保持される)。 - + このオプションは、評価済みのトップレベル式が大量のメモリを消費するときや、再現性のある実行性能の計測をしたいときに有用かもしれない。 - - + + - - + + +s +s - + 一つ式を評価するごとに、経過時間や確保されたバイト数などの統計情報を表示する。注意: 確保されたバイト数はGC毎に計算されるので、これは記憶領域管理器の確保領域の大きさ程度の正確さしかない。そういうわけで、GCが起こらなかった場合、値として0が表示されるかもしれない。 - - + + - - + + +t +t - + 文がプロンプトに入力されたとき、束縛された変数それぞれの型を表示する。入力されたのが単一の式なら、束縛されるのは変数「it」だけである。 - - + + @@ -2277,28 +2277,28 @@ warning settings: あなたの.ghciにこのマクロを置いておけば、:source fileとすることでfileからGHCiコマンドを読み込むことができる。Haskell wikiのページGHC/GHCiでは、.ghciについてのその他の助言を読むことが(そしてもちろん、追加することも)できる。 - 加えて、標準のファイルの後には-ghci-scriptフラグで指定されたファイルが全て読まれる。これによってデフォルト以外の.ghciファイルを使うことができる。 + 加えて、標準のファイルの後には-ghci-scriptフラグで指定されたファイルが全て読まれる。これによってデフォルト以外の.ghciファイルを使うことができる。 開始時ファイルが読まれるかどうかを制御する二つのコマンド行オプションがある。 - + - + 開始するとき、./.ghciその他の開始時ファイルを読まない。 - + - + - - 通常の開始ファイルの後に指定されたファイルを読む。繰り返すことで複数の入力を指定できる。 - + + 通常の開始ファイルの後に指定されたファイルを読む。繰り返すことで複数の入力を指定できる。 + @@ -2361,44 +2361,44 @@ warning settings: インタプリタがforeign export宣言のあるモジュールをロードできません! - + 残念ながらその通りである。それはまだ実装されていない。問題のあるモジュールは手でコンパイルしてからGHCiにロードしてほしい。 - + - + GHCiで-Oがうまく働きません! - + 技術的な理由から、バイトコードコンパイラが特定の最適化過程とうまく相互作用しないので、解釈実行器を使うときは最適化が無効にしてある。これは大きな問題ではない。高速に実行されるべきコードは、コンパイルしておくことで、最適化つきで解釈実行するよりもずっと速く実行できる。 - + 非ボックス化タプルがGHCiで使えない - + その通り。しかし、非ボックス化タプルを使うモジュールをコンパイルして、それをGHCiにロードするということは常にできる。(ちなみに、上記の、-OがGHCiで使えないというのは、バイトコードコンパイラが非ボックス化タプルを扱えないからである) - + GHCiが入力を待っている間、並列スレッドが走りつづけてくれない。 - + GHCiがスイッチを有効(デフォルト)にしてコンパイルされている限り、問題はないはずである。インストールしたGHCの供給元に相談してほしい。 - + getContentsを使った後、:load:reloadするまでstdinが使えない。 - + それはgetContentsの定義通りの振る舞いである。getContentsはハンドルをセミクローズという状態にするが、その状態ではいかなるIO操作も禁止される。計算と計算の間でIOの状態は保持されるので、次に:load:reloadコマンドが実行されるまでセミクローズ状態が続く。 :set +rというコマンドでstdinが毎回元の状態に復元されるようにすることができる。これがうまく行くのは、stdinが単なるトップレベルの式で、他のトップレベルの式(CAF)と同様の方法で未評価の状態に戻すことができるからである。 - + @@ -2409,7 +2409,7 @@ warning settings: - デフォルトのバッファリングモードがGHCiとGHCで異なっている。 + デフォルトのバッファリングモードがGHCiとGHCで異なっている。 GHCでは、デフォルトでstdoutハンドルは行バッファされている。しかし、GHCiでは、stdoutに関するバッファリングを無効にしてある。これが通常インタプリタに期待される振る舞いだからである。出力は生成されるとすぐに出現する。