如果我有一个可能无限的 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/