你有一系列的操作,由于某些高固定开销(例如数据包头或建立连接),它们更喜欢以块的方式执行。限制在于有时下一个动作取决于上一个动作的结果,在这种情况下,所有挂起的操作将同时执行。
示例:
这让我想起很多 Haskell 的概念,但我无法准确定义。
示例:
mySession :: Session IO ()
a <- readit -- nothing happens yet
b <- readit -- nothing happens yet
c <- readit -- nothing happens yet
if a -- all three readits execute because we need a
then write "a"
else write "..."
if b || c -- b and c already available
...
这让我想起很多 Haskell 的概念,但我无法准确定义。
当然,你可以做一些明显的事情,比如:
[a,b,c] <- batch([readit, readit, readit])
但出于平滑度的目的,我希望向用户隐藏分块的事实。
不确定“Session”是否是正确的词语。也许你可以建议更好的吗?(我想到了Packet,Batch,Chunk和Deferred)
更新
我认为昨晚我在手机上读到了一个非常好的答案,但今天回来寻找时它已经消失了。我是在做梦吗?
unsafeInterleaveIO
。远离它,它是邪恶的。你会在纯代码内运行IO操作。将a+b
改为b+a
可能会破坏你的程序,因为IO操作按相反顺序运行。别说我没警告过你。:-P - chiunsafeInterleaveIO
并不像unsafePerformIO
那样邪恶,但如果使用不当仍可能引入错误。例如:如果你正在使用它将某些内容加载到列表中,你必须考虑迭代列表本身是否会触发IO操作,或者它是否会通过评估实际元素来触发。 - Jeremy List