65 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			65 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| ---
 | |
| title: Monad
 | |
| ---
 | |
| 
 | |
| # Monad Laws
 | |
| There are 3 laws which must be satisfied by a data type to be considered as monad
 | |
| 
 | |
| ## Left Identity
 | |
| `return a >>= f` must equal `f a`
 | |
| 
 | |
| This states that if we take a value and use `return` to put it in default context,
 | |
| then use `>>=` to feed it into a function, it's the same as applying the
 | |
| function to the original value.
 | |
| 
 | |
| ## Right Identity
 | |
| `m >>= return` must equal `m`
 | |
| This states that if we use `>>=` to feed a monadic value into return, we
 | |
| get back our original monadic value.
 | |
| 
 | |
| ## Associativity
 | |
| `(m >>= f) >>= g` must equal `m >>= (\x -> f x >>= g)`
 | |
| This allows us to chain together monadic function applications, regardless of
 | |
| how they are nested.
 | |
| 
 | |
| This may seem obvious, and you may assume that it should work by default, but the
 | |
| associative law is required for this behavior
 | |
| 
 | |
| # But what about `>>=` and `return`?
 | |
| Simple:
 | |
| 
 | |
| `>>=`, or 'bind' takes a monad and a function that takes a value and returns a
 | |
| monad, and applies the function to a monad. This essentially allows us to
 | |
| manipulate data within monads, which can't be accessed by non-monadic functions.
 | |
| 
 | |
| `return`, on the other hand, takes a value and returns a monad containing
 | |
| that value. Everything you could ever want to know about `return` is right
 | |
| there in the type signature:
 | |
| ```haskell
 | |
| return :: a -> m a
 | |
| ```
 | |
| 
 | |
| # Maybe Monad
 | |
| 
 | |
| ```haskell
 | |
| justHead :: Maybe Char
 | |
| justHead = do  
 | |
|     (x:xs) <- Just ""  
 | |
|     return x
 | |
| ```
 | |
| 
 | |
| # List Monad
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| return is same as pure of applicative
 | |
| 
 | |
| 
 | |
| instance Monad [] where  
 | |
|     return x = [x]  
 | |
|     xs >>= f = concat (map f xs)  
 | |
|     fail _ = []  
 | |
| 
 | |
| 
 |