Functor hierarchy proposal

From HaskellWiki
Revision as of 07:02, 25 April 2006 by Ashley Y (talk | contribs)
Jump to navigation Jump to search

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 "return", "*>" be renamed ">>", and that Monad be made a subclass of Applicative:

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.