2014-01-14 21 views
14

私は分かりません。GHCiとrunHaskellのgetLine機能の違い

私はGHCiのを使用していますし、getLineを使用している場合、私はHaskellで同じを書く場合

module Main where 

main :: IO() 
main = do a <- getLine 
      putStrLn a 

を提出し、runhaskellでスクリプトを実行し、入力し

Prelude> a <- getLine 
Test<Backspace>oo<CR> -- the Backspace action results in a '^?' 
Prelude> a 
"Test\DELoo" 

次取得バックスペースは 't'を期待どおりに削除します。

なぜ違いがありますか?

答えて

20

これは、GHCiとGHCのバッファリング動作が異なるためです。 GHCiはデフォルトでNoBufferingを標準入力ストリームとし、GHCコンパイルされたバイナリ/ runhaskellはデフォルトでLineBufferingを使用します。明示的に行う場合、Haskellプログラムで

hSetBuffering stdin NoBuffering 

を実行すると、GHCiの動作を再現することができます。あなたはGHCiの中

hSetBuffering stdin LineBuffering 

を行う場合は、望ましくない副作用の多くを持っていますが、runhaskell動作を再現することができます。

+1

あなたは「望ましくない副作用がたくさんある」と言いますが、それらはghciに嫌われているのですか、コンパイルされたバージョンでは何らかの保護がありますか?これについてもう少し詳しく説明できますか? – epsilonhalbe

+0

あなたはそうしているかしていない - できるだけ早くこの回答を受け入れるよ! – epsilonhalbe

+2

彼らはGHCiで不必要です。 GHCi自体が入力を読み取る方法が混乱します.GHCiを実行するためのものを入力すると、Returnキーを押すと表示されます。 – kosmikus

関連する問題