Haskell 有没有可能在不使用unsafeIO的情况下使用惰性版本的'sequence'?
如果我有一个可能无限多的Haskell 有没有可能在不使用unsafeIO的情况下使用惰性版本的'sequence'?,haskell,Haskell,如果我有一个可能无限多的IO-单子列表,并且我保证它们的顺序执行不会受到其他IO的影响,我是否可以以某种方式将其延迟排序(评估) 为了澄清我的观点,下面是一些伪Haskell代码,演示了我的想法: main = do inputs <- sequence . repeat $ getLine -- we are forever stuck here mapM_ putStrLn inputs -- not going to run 但是在我的应用程序中,IOmonad不是
IO
-单子列表,并且我保证它们的顺序执行不会受到其他IO
的影响,我是否可以以某种方式将其延迟排序(评估)
为了澄清我的观点,下面是一些伪Haskell代码,演示了我的想法:
main = do
inputs <- sequence . repeat $ getLine -- we are forever stuck here
mapM_ putStrLn inputs -- not going to run
但是在我的应用程序中,
IO
monad不是getLine
,而是一个外部函数get1::IO(可能是记录)
。然而,这实际上说明了我的观点,因为显然getContents
内部使用unsafeIO
s来实现这种惰性效果。我的问题是,这有必要吗?(如果您对我想做的事情感兴趣,请参阅。)也许您正在寻找这个
main = do
let inputs = repeat getLine
mapM_ (>>=putStrLn) inputs
只是想提醒猫:不
如果您有类型为IO a
的东西,如果不完全执行IO
块,就无法从该a
中获取任何信息。从概念上讲,act::IO a
可以定义为一组任意复杂的操作,然后根据对系统随机数生成器的调用生成一个结果
unsafeInterleaveIO
的全部目的是执行您的请求,没有它就无法完成。假设“它们的顺序执行不会受到其他IO
s的影响”不能被“安全”例程依赖,因为我们总是可以传递一些违反上述假设的IO
操作。因此,在某一点上,您确实需要一些“不安全”的原语。您是否确定它们的执行不会受到其他IO
s的影响?例如,编写getLine
示例的明显方法是allLines=do{x在链接线程中没有限制Heinrich的答案是否已经回答了这个问题?@ErikAllik如果问题不是顺序读取句柄或类似的,而是对某些任意IO操作的交错效果,那么可能不是。他们可能希望unsafeInterleaveIO
在某个地方,具体取决于他们正在做什么。或者他们想要用可以用迭代法解决的问题来重新表述问题。
main = do
let inputs = repeat getLine
mapM_ (>>=putStrLn) inputs