【发布时间】:2014-12-30 03:17:23
【问题描述】:
在延续tutorial 的底部附近有一个以
开头的协程实现-- The CoroutineT monad is just ContT stacked with a StateT containing the suspended coroutines.
newtype CoroutineT r m a = CoroutineT {runCoroutineT' :: ContT r (StateT [CoroutineT r m ()] m) a}
deriving (Functor,Applicative,Monad,MonadCont,MonadIO)
-- Used to manipulate the coroutine queue.
getCCs :: Monad m => CoroutineT r m [CoroutineT r m ()]
getCCs = CoroutineT $ lift get
putCCs :: Monad m => [CoroutineT r m ()] -> CoroutineT r m ()
putCCs = CoroutineT . lift . put
然后还使用getCCs 和putCCs 定义了dequeue 和queue 函数。
我不明白协程队列是如何维护的。 getCCs 和 putCCs 的类型签名似乎没有表明在调用之间维护的任何类型的“变量”。我怀疑状态与getCCs 和putCCs 的实现中的get 和put 有关,但我不知道它们是什么。
【问题讨论】: