Monad
From HaskellWiki
MichalPalka (Talk | contribs) m (Fix spelling error) |
(Merged tutorial section with Tutorials) |
||
Line 97: | Line 97: | ||
Monads are known for being deeply confusing to lots of people, so there are plenty of tutorials specifically related to monads. Each takes a different approach to Monads, and hopefully everyone will find something useful. |
Monads are known for being deeply confusing to lots of people, so there are plenty of tutorials specifically related to monads. Each takes a different approach to Monads, and hopefully everyone will find something useful. |
||
− | * [http://www.engr.mun.ca/~theo/Misc/haskell_and_monads.htm Monads for the Working Haskell Programmer] |
+ | See [[Tutorials#Using_monads|Monad tutorials]]. |
− | * [[Monads as containers]], [[Monads as computation]] |
||
− | * [http://haskell.org/all_about_monads/html/index.html All About Monads] |
||
− | * [[Simple monad examples]] |
||
− | * [http://www.loria.fr/~kow/monads/index.html Of monads and space suits] |
||
− | * [http://sigfpe.blogspot.com/2006/08/you-could-have-invented-monads-and.html You could have invented monads] |
||
− | * [[Meet Bob The Monadic Lover]], or the slightly more serious [[The Monadic Way]] |
||
− | * Computational monads [http://programming.reddit.com/info/ox6s/comments/coxiv part 1] and [http://programming.reddit.com/info/ox6s/comments/coxoh part 2]. |
||
− | * [http://www.alpheccar.org/fr/posts/show/60 Three kind of monads] : sequencing, side effects or containers |
||
− | * [http://en.wikipedia.org/wiki/Monads_in_functional_programming Article on monads on Wikipedia] |
||
− | * [[IO inside]] page explains why I/O in Haskell is implemented with a monad. |
||
− | * [http://haskell.org/haskellwiki/Books_and_tutorials#Using_monads More tutorials on monads] |
||
− | * [http://haskell.org/haskellwiki/Blog_articles#Monads Even more tutorials on monads..] |
||
== Monad reference guides == |
== Monad reference guides == |
Revision as of 16:56, 13 December 2007
import Control.Monad |
Monads in Haskell are structures used to supplement pure computations with features like state, common environment or I/O. Even though Haskell is a purely-functional language, side-effects can be conveniently simulated using monads.
Because they are very useful in practice but rather mind-twisting for the beginners, numerous tutorials that deal exclusively with monads were created (see monad tutorials).
Contents |
1 Common monads
Most common applications of monads include:
- Representing failure using monadMaybe
- Nondeterminism through backtracking using monadList
- State using monadState
- Read-only environment using monadReader
- I/O using monadIO
2 Monad class
All common monads are members of Monad class defined like this:
class Monad m where (>>=) :: m a -> (a -> m b) -> m b (>>) :: m a -> m b -> m b return :: a -> m a fail :: String -> m a
In addition to implementing the class functions, all instances of Monad should obey following equations:
return a >>= k = k a m >>= return = m m >>= (\x -> k x >>= h) = (m >>= k) >>= h
See this intuitive explanation of why they should obey the Monad laws.
Any Monad can be made a Functor by defining
fmap ab ma = ma >>= (return . ab)
However, the Functor class is not a superclass of the Monad class. See Functor hierarchy proposal.
3 Special notation
In order to improve the look of code that uses monads Haskell provides a special syntactic sugar calledthing1 >>= (\x -> func1 x >>= (\y -> thing2 >>= (\_ -> func2 y (\z -> return z))))
which can be written more clearly by breaking it into several lines and omitting parentheses:
thing1 >>= \x -> func1 x >>= \y -> thing2 >>= \_ -> func2 y >>= \z -> return z
do x <- thing1 y <- func1 x thing2 z <- func2 y return z
4 Commutative monads
Commutative monads are monads for which the order of actions makes no difference (they commute), that is when following code:
do a <- f x b <- g y m a b
is the same as:
do b <- g y a <- f x m a b
Examples of commutative include:
- monadReader
- monadMaybe
5 Monad tutorials
Monads are known for being deeply confusing to lots of people, so there are plenty of tutorials specifically related to monads. Each takes a different approach to Monads, and hopefully everyone will find something useful.
See Monad tutorials.
6 Monad reference guides
An explanation of the basic Monad functions, with examples, can be found in the reference guide A tour of the Haskell Monad functions, by Henk-Jan van Tuyl.
7 Monad research
A collection of research papers about monads.
8 Monads in other languages
Implementations of monads in other languages.
- C
- C++, doc
- CML.event ?
- Clean State monad
- JavaScript
- Java (tar.gz)
- Joy
- LINQ, more, C#, VB
- Lisp
- Miranda
- OCaml:
- Perl
- Perl6 ?
- Prolog
- Python
- Python
- here
- Twisted's Deferred monad
- Ruby:
- Scala:
- Scheme:
- Tcl
- The Unix Shell
- More monads by Oleg
- CLL: a concurrent language based on a first-order intuitionistic linear logic where all right synchronous connectives are restricted to a monad.
Unfinished:
- Slate
- Parsing, Maybe and Error in Tcl
And possibly there exist:
- Standard ML (via modules?)
Please add them if you know of other implementations.
Collection of links to monad implementations in various languages. on Lambda The Ultimate.
9 Interesting monads
A list of monads for various evaluation strategies and games:
- Identity monad
- Optional results
- Random values
- Read only state
- Writable state
- Unique supply
- ST
- State
- Undoable state
- Function application
- Error
- Atomic memory transactions
- Continuations
- IO
- Non-deterministic evaluation
- List monad
- Concurrent threads
- Backtracking
- Region allocation
- LogicT: backtracking monad transformer with fair operations and pruning
- Pi calculus as a monad
- Halfs, uses a read-only and write-only monad for filesystem work.
- House's H monad for safe hardware access
There are many more interesting instance of the monad abstraction out there. Please add them as you come across each species.
10 Fun
- If you are tired of monads, you can easily get rid of them.