Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 有没有可能在不使用unsafeIO的情况下使用惰性版本的'sequence'?_Haskell - Fatal编程技术网

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