サイモン・ペイトン・ジョーンズは、厄介な分隊に取り組むという論文で、 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 から取り出され、そのスコープは現在のブロックのみに制限されています。