18

私はちょうど私が理解していないものに出くわしました。

私が GHCi を使用していて使用するgetLineと、次のようになります

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

Haskellファイルに同じことを書くと

module Main where

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

runhaskell でスクリプトを実行し、同じ入力を入力すると、バックスペースは期待どおりに「t」を削除します。

なぜ違いがあるのですか?

4

1 に答える 1

23

これは、GHCi と GHC のバッファリング動作が異なるためです。GHCi には stdin (標準入力ストリーム) usingNoBufferingデフォルトがあり、GHC でコンパイルされたバイナリ / runhaskelluseLineBufferingがデフォルトです。明示的に行う場合

hSetBuffering stdin NoBuffering

Haskell プログラムでは、GHCi の動作を再現できます。もしあなたがそうするなら

hSetBuffering stdin LineBuffering

GHCi では、多くの不要な副作用がありますが、runhaskell動作を再現できます。

于 2014-01-14T13:08:01.127 に答える