我写了下面的函数,我相信应该以原子方式执行IO(只要其他人使用相同的MVar
)。Haskell:原子IO包装/懒惰?
atomicIO :: MVar() -> IO a -> IO a
atomicIO mvar io =
do
takeMVar mvar
result <- io
putMVar mvar()
return result
而且,从我的理解,哈斯克尔IO的某些部分是懒惰(例如.. IORef
S),所以无需实际执行本节中的操作。它只能返回一个'thunk'(这是正确的词?),它列出了需要完成的任务。
这个想法是,关键部分(即单线程部分)应该很快。
但是,可以说我正在写IORef
s,我希望Haskell立即开始计算结果,因此可以在需要时做好准备。但就像我之前说过的,当我们持有MVar
锁时,我不想锁定在关键部分。
所以我想过这样做:
result <- io `par` io
或本
return result `par` result
或本
result `par` return result
但我不知道,如果这样做的工作。这是正确的方法之一,还是有另一种方式? (我对后两者的关注是IO()
动作,因为我并没有真正做任何工作,我并没有评估()
)。
dave4420:有没有办法用'modifyIORef'做类似的事情,还是我需要做一个单独的'readIORef'后跟'writeIORef'? – Clinton 2012-04-16 08:59:55
(我猜这无关紧要,尽管无论如何我已经锁定了它) – Clinton 2012-04-16 09:05:59
@Clinton看到我的编辑。 – dave4420 2012-04-16 09:22:12