0

char get / putメソッドを使用しているために予想されるコードの一部は、すべての入力文字で応答するはずですが、そうではないようです。むしろ、改行を待ってから文字列全体を実行しますが、これは私にはまったく意味がありません...

私は何が間違っているのですか?これを各入力文字に反応させるにはどうすればよいですか?

main = repeatUntilExit stdin stdout putChar ""

repeatUntilExit :: Handle -> Handle -> (Char -> IO ()) -> [Char] -> IO ()
repeatUntilExit hIn hOut f "exit\n" = hPutStrLn hOut "bye\n"
repeatUntilExit hIn hOut f x = hGetChar hIn >>= \c -> f c >> repeatUntilExit hIn hOut f (appendToLastFive c)
  where appendToLastFive a = (reverse . (:)a . take 4 . reverse) x

結果は次のとおりです。

C:\temp>echo.exe
an entire line of text
an entire line of text
exit
exit
bye

C:\temp>
4

1 に答える 1

5

これはバッファリングの質問です。

import System.IO

hSetBuffering stdin NoBuffering

ただし、これはWindowsでは機能しませんが、ここに記載されている未修正の問題です。

于 2013-03-15T15:18:35.647 に答える