我正在使用以下数据类型实现一个非常简单的穷人并发结构:
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)
正在创建一个新的Atomic
monad,其中包含f
( * -> *
) 的结果应用于 内部的值m
?
Q2。我是否说在Monad m
这里使用超类来启用liftM
? 如果是这样,因为这是Monad
类的一个实例,为什么不能liftM
直接访问?