- Haskell - Zippers
- Haskell - Monads
- Haskell - Functor
- Haskell - Input & Output
- Haskell - Modules
- Haskell - Function Composition
- Haskell - More On Functions
- Haskell - Functions
- Haskell - Types and Type Class
- Haskell - Decision Making
- Haskell - Basic Operators
- Haskell - Basic Data Models
- Haskell - Environment Set Up
- Haskell - Overview
- Haskell - Home
Haskell Useful Resources
Selected Reading
- Who is Who
- Computer Glossary
- HR Interview Questions
- Effective Resume Writing
- Questions and Answers
- UPSC IAS Exams Notes
Haskell - Monads
Monads are nothing but a type of Apppcative Functor with some extra features. It is a Type class which governs three basic rules known as monadic rules.
All the three rules are strictly apppcable over a Monad declaration which is as follows −
class Monad m where return :: a -> m a (>>=) :: m a -> (a -> m b) -> m b (>>) :: m a -> m b -> m b x >> y = x >>= \_ -> y fail :: String -> m a fail msg = error msg
The three basic laws that are apppcable over a Monad declaration are −
Left Identity Law − The return function does not change the value and it should not change anything in the Monad. It can be expressed as "return >=> mf = mf".
Right Identity Law − The return function does not change the value and it should not change anything in the Monad. It can be expressed as "mf >=> return = mf".
Associativity − According to this law, both Functors and Monad instance should work in the same manner. It can be mathematically expressed as "( f >==>g) >=> h =f >= >(g >=h)".
The first two laws iterate the same point, i.e., a return should have identity behavior on both sides of the bind operator.
We have already used lots of Monads in our previous examples without reapzing that they are Monad. Consider the following example where we are using a List Monad to generate a specific pst.
main = do print([1..10] >>= (x -> if odd x then [x*2] else []))
This code will produce the following output −
[2,6,10,14,18]Advertisements