Haskell IO 执行顺序

标签 haskell io order-of-execution

我有以下代码:

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 monad 保证它的 Action 按照它们在代码中的顺序被调用(或者我理解写的是什么 here )。那么为什么它不能正常工作呢?

最佳答案

实际上,putStrhFlushgetLine 之前正在执行操作行动——然而,isEOF在任一之前被执行,直到它知道输入是否为 EOF 才返回。或者不,也就是说,直到您输入一行。您可能会考虑移动 isEOF就在 getLine 之前, 像这样:

main :: IO ()
main = do
    putStr "$ "
    hFlush stdout
    unlessFinished $ do
        getLine >>= putStrLn
        main
    where
    unlessFinished action = isEOF >>= flip unless action

关于Haskell IO 执行顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34009127/

相关文章:

haskell - Haskell中do block 中 `<-`的含义

haskell - 为什么有一个单独的类型模块?

java - 读取 Sdcard 上的文件时出错

java - 快速读取文本文件的最后一行?

c - C 中数组索引(相对于表达式)的求值顺序

c++ - 什么时候对函数参数c++执行 move 操作

haskell - 将字符串列表应用于任意函数

Haskell 和纯函数结果的内存

Java - 如何终止非阻塞标准输入读取循环