私は、次のコードを持っている:HaskellのIOの実行順序
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
がさえ、それの行為は、彼らはコード内で配列を決定している(またはので、私はhere書かれているかを理解)の順序で呼び出されていることIO
モナドを保証してもputStr "$ "
前に呼び出されることと思われます。なぜそれが正しく動作しないのですか?実際
ちなみに、私はコードを自分で実行してみましたまで、私は実際にあなたを信じていませんでした。それから私は実際に "whaaaaa ...?"と言った。大声で私の部屋で。あなたの質問を素晴らしい、消化し易い、驚くべき形に蒸した素晴らしい仕事! –
ありがとうございます。私にとっても驚きました。実際に私は結局ハスケルの「失敗」ではないと信じ始めていましたが、私が以前は知らなかった他のシェル/ターミナル/ OSの落とし穴です。 :) – Sventimir