Functor hierarchy proposal
Currently the standard libraries include a
Functor class and a
Monad class, and
Functor is not a superclass of
Monad, even though logically every monad is a functor. New classes have been added to HEAD to create a richer hierarchy of Functor classes:
class Functor f where fmap :: (a -> b) -> f a -> f b class Functor f => Applicative f where pure :: a -> f a (<*>) :: f (a -> b) -> f a -> f b (*>) :: Applicative f => f a -> f b -> f b fa *> fb = (fmap (const id) fa) <*> fb
I propose that "
pure" be renamed "
*>" be renamed "
>>", and that
Monad be made a subclass of
class (Applicative f) => Monad f where (>>=) :: f a -> (a -> f b) -> f b
The downside of this is that every instance declaration of Monad would have to be accompanied by instance declarations for the superclasses, but see Class system extension proposal.
It might also be useful to split a
Pointed class from the
class Pointed f where pure :: a -> f a class (Functor f, Pointed f) => Applicative f where (<*>) :: f (a -> b) -> f a -> f b (*>) :: Applicative f => f a -> f b -> f b fa *> fb = (fmap (const id) fa) <*> fb
Pointed functionality by itself could be useful, for example, in a DSL in which it is only possible to embed values and not to lift functions to functions over those embedded values.