考える例外: MVARを更新すると、例外
λ: >:t putMVar
putMVar :: MVar a -> a -> IO()
λ: >:t x
x :: IO (MVar [Char])
まだそれはなぜそれが失敗したとどのように私はと
x
を更新することができます
λ: >x >>= \y -> putMVar y "foo"
:^?^?
*** Exception: thread blocked indefinitely in an MVar operation
を失敗しました:私はputMVar
を呼び出そうとしました
λ: >let x = Control.Concurrent.MVar.newMVar ""
λ: >:t x
x :: IO (MVar [Char])
を"foo"
ではなく""
?
私はあなたが新しいMVarを値で作成すると思います。あなたがそれを入れる前にその値を抽出する必要があります! – epsilonhalbe
これは意図されています: 'MVar'のセマンティクスは、mutexで保護された1位のキューの1つです。 '" "を含む完全なキューを作成します。キューを最初に 'takeMVar'で空にするまで、他のものをキューに入れることはできません。さもなければ 'putMVar'は他の誰かが最初にキューを空にするのを待ちます。あなたのケースでは、GHCは誰もキューを空にすることができないことに気づき、永遠に詰まる代わりに例外をトリガーします(ランタイムは親切にしようとしています。 – chi