User:Zzo38/Proposal about classes: Difference between revisions
(New page: This document is proposal relating to various things dealing with classes in Haskell. ==Monads== Move <tt>join</tt> into the <tt>Monad</tt> class, to allow monads to defined in terms of u...) |
No edit summary |
||
Line 12: | Line 12: | ||
join :: m (m a) -> m a; | join :: m (m a) -> m a; | ||
fail :: String -> m a; | fail :: String -> m a; | ||
a >>= f = join $ fmap f a; | a >>= f = join $ fmap f a; | ||
m >> k = m >>= \_ -> k; | m >> k = m >>= \_ -> k; | ||
join = (>>= id); | join = (>>= id); | ||
fail = error; | fail = error; | ||
fmap f m = m >>= return . f; | fmap f m = m >>= return . f; | ||
}; | }; |
Revision as of 20:17, 3 September 2011
This document is proposal relating to various things dealing with classes in Haskell.
Monads
Move join into the Monad class, to allow monads to defined in terms of unit/join/fmap. Together with things described below, it can automatically be Functor as well, and define fmap if you are using return/bind definitions.
Default superclass definitions
For example, for monads you can have:
class Functor m => Monad (m :: * -> *) where { (>>=) :: forall a b. m a -> (a -> m b) -> m b; (>>) :: forall a b. m a -> m b -> m b; return :: a -> m a; join :: m (m a) -> m a; fail :: String -> m a; a >>= f = join $ fmap f a; m >> k = m >>= \_ -> k; join = (>>= id); fail = error; fmap f m = m >>= return . f; };
In this case, you can define the defaults for Functor if they are not already defined.
Restrictive classes
For example, make a restrictive monad that only contains instances of Ord. I am not sure about syntax or other details.
Classes of classes
See proposal of kinds.