我定义了Monad实例的数据只是为了使用do
符号。但是,通过GHC 7.10+中实现的JB Nizet's answer,我还必须将数据定义为Applicative和Functor的实例。我不打算定义fmap
,pure
,<*>
,因为它们很容易来自liftM
,return
和ap
就Monad而言。
使Penative的超类明确是好的。但是,AMP是否也会在编写那些完全无用的部分时引入一些非常不必要的代码?或者,如果Haskell有一些简单的方法来应对这种情况?有些人喜欢:
class Applicative m => Monad m where
super pure = return
super (<*>) = ap
return :: a -> m a
(>>=) :: m a -> (a -> m b) -> m b