我正在使用以下数据类型实现一个非常简单的穷人并发结构:
data C m a = Atomic (m (C m a)) | Done a
我为此创建了一个 monad 实例:
instance Monad m => Monad (C m) where
(>>=) (Atomic m) f = Atomic $ (liftM (>>= f) m)
(>>=) (Done v) f = f v
return = Done
Q1。我是否正确地说Atomic $ (liftM (>>= f) m)正在创建一个新的Atomicmonad,其中包含f( * -> *) 的结果应用于 内部的值m?
Q2。我是否说在Monad m这里使用超类来启用liftM? 如果是这样,因为这是Monad类的一个实例,为什么不能liftM直接访问?