User:Zzo38/Proposal about classes
From HaskellWiki
(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...) |
|||
| 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.
Contents |
1 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.
2 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.
3 Restrictive classes
For example, make a restrictive monad that only contains instances of Ord. I am not sure about syntax or other details.
4 Classes of classes
See proposal of kinds.
