私は次のコードを持っています:
import Control.Monad (unless)
import System.IO (isEOF, hFlush, stdout)
main :: IO ()
main = unlessFinished $ do
putStr "$ "
hFlush stdout
getLine >>= putStrLn
main
where
unlessFinished action = isEOF >>= flip unless action
このコードをコンパイルして実行すると、空白行の先頭にカーソルが表示され、[Enter] を押した後にのみ出力$
され、私が書いたものは何でも出力されます。
モナドは、コードでシーケンスされた順序でアクションが呼び出されることを保証しますgetLine
が、前に呼び出されるように見えます (または、ここに書かれていることを理解しています)。では、なぜ正しく動作しないのでしょうか?putStr "$ "
IO