3
我對this指南中給出的交錯函數有些困惑。基本線程,交錯線程混淆?
,我有以下數據類型:
data M m r = Atomic (m (M m r)) | Done r
我創建了一個升降功能採取m a
,裏面插入的Done
a
,然後重新插入Done a
回到m()
。這形成了Atomic
結構:
atm :: Monad m => m a -> M m a
atm m = Atomic $ liftM Done m
我做M m
的Monad
類的一個實例(其中模式匹配基於數據的構造函數):
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)