是否有可能在不使用`unsafeIO`s的情况下拥有`sequence`的懒惰版本?

时间:2015-10-17 22:02:17

标签: haskell

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

2 个答案:

答案 0 :(得分:0)

也许你在找这个?

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

答案 1 :(得分:0)

只是为了给猫铃声:

如果你有IO a类型的内容,那么在没有完全执行a块的情况下,无法从IO中获取任何信息。从概念上讲,act :: IO a可以定义为一组任意复杂的动作,然后根据对系统随机数生成器的调用生成结果。

unsafeInterleaveIO的整个目的是执行您所要求的内容,没有它就无法完成。