It doesn't have to be a Monad
even, this works for every Applicative
. So yes, you could define:
class (Functor f, Monoid (f ())) => Applicative f where
But this means that you would have to provide the Monoid
instance every time you write an Applicative
instance. That can be quite annoying, certainly since this Monoid
instance would not be used very often.
A better solution is to create a newtype wrapper around f ()
, and then you can provide a Monoid
instance for all applicative functors once and for all. There's one readily available in the reducers package.