在解决尴尬的小队的论文中,西蒙·佩顿·琼斯提供了一个“可能的实现” Channel
。
type Channel a = (MVar (Stream a) , -- Read end
MVar (Stream a) ) -- Write end (the hole)
type Stream a = MVar (Item a)
data Item a = MkItem a (Stream a)
现在,他实现了putChan :: Channel a -> a -> IO ()
这样的功能
putChan (read, write) val
= do { new_hole <- newEmptyVar ;
old_hole <- takeMVar write ;
putMVar write new_hole ;
putMVar old_hole (MkItem val new_hole) }
上面的函数从写入中取出一个 MVar,然后将一个空的 MVar 放入其中。
然后它写入从 write 中提取的 old_hole。
问题是,它为什么要写入 old_hole?它已经从 write 中取出,并且它的范围仅限于当前块,那么它有什么区别呢?