如果我有一个可能无限的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。)
答案 0 :(得分:0)
也许你在找这个?
main = do
let inputs = repeat getLine
mapM_ (>>=putStrLn) inputs
答案 1 :(得分:0)
只是为了给猫铃声:否。
如果你有IO a
类型的内容,那么在没有完全执行a
块的情况下,无法从IO
中获取任何信息。从概念上讲,act :: IO a
可以定义为一组任意复杂的动作,然后根据对系统随机数生成器的调用生成结果。
unsafeInterleaveIO
的整个目的是执行您所要求的内容,没有它就无法完成。