thisガイドに記載されているインターリーブ機能によって少し混乱します。基本的なスレッド、インターリーブスレッドの混乱?
私は次のデータ型があります:私はm a
を取るために昇降機能を作成しました
data M m r = Atomic (m (M m r)) | Done r
を、Done
内a
を挿入し、バックm()
に再度挿入Done a
。これはAtomic
構造を形成する:
atm :: Monad m => m a -> M m a
atm m = Atomic $ liftM Done m
私は(データコンストラクタに基づいて、パターンマッチ)Monad
クラスのM m
インスタンスを作りました:
instance (Monad m) => Monad (M m) where
return = Done
(Atomic m) >>= f = Atomic liftM (>>= f) m
(Done r) >>= f = f v
ネストされた値にアクセスする単純な実装の機能がありますAtomic wrapper
内:
runThread :: Monad m => M m a -> m a
runThread (Atomic m) = m >>= runThread --Extract m and recursively pass to runThread
runThread (Done r) = return r --Return Done
次に、次のインターリーブ機能があります。上:混乱の
interleave :: Monad m => M m r -> M m r -> M m r
interleave (Atomic m1) (Atomic m2) = do
next1 <- atm m1 --?
next2 <- atm m2 --?
interleave next1 next2
interleave (Done _) t2 = interleave t2
interleave t1 (Done _) = interleave t1
マイポイントnext1 <- atm m1
とnext2 <- atm m2
です。私はそれを理解したよう
、このすべてが(Atomic m1)
ラッパーからm1
を取り、Atomic
ラッパーに戻し、それを再挿入されているのですか?この操作はどのようにインタリーブされますか?
ここに基本的なものがありません。コードは正常に動作するので、私はそれが私の混乱のためだと確信しています。
残りのコード:
threadOne :: M IO()
threadOne = do
atm $ print 1
threadTwo :: M IO()
threadTwo = do
atm $ print 2
main = do
runThread (interleave threadOne threadTwo)