如果我有一个可能无限的 IO -monad 列表,并且我保证它们的顺序执行不会受到其他 IO 的影响,我可以以某种方式对其进行惰性排序(评估)吗?

为了澄清我的观点,这里有一些伪 Haskell 代码展示了我的想法:

main = do
    inputs <- sequence . repeat $ getLine -- we are forever stuck here
    mapM_ putStrLn inputs -- not going to run

现在,我知道在上面的特定示例中,我们可以使用 getContents 来获得我想要的效果
main = do
    inputs <- return . lines =<< getContents
    mapM_ putStrLn inputs

但是在我的应用程序中,IO monad 不是 getLine 而是一个外部函数 get1 :: IO (Maybe Record) 。然而,这实际上带来了我的观点,因为显然 getContents 内部使用 unsafeIO 来实现这种懒惰的效果。我的问题是,有必要吗? (如果你对我到底想做什么感兴趣,请引用 this question 。)

最佳答案

也许你正在寻找这个?

main = do
  let inputs = repeat getLine
  mapM_ (>>=putStrLn) inputs

关于haskell - 是否可以在不使用 `sequence` 的情况下拥有 `unsafeIO` 的惰性版本?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33192048/

10-13 03:07