# User:Zzo38/Proposal about classes

### From HaskellWiki

< User:Zzo38(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.