post(typoclassopedia): Monad#instances
This commit is contained in:
		@@ -555,3 +555,78 @@ In the laws above, `≅` refers to isomorphism rather than equality. In particul
 | 
				
			|||||||
          = fmap (u . v) w
 | 
					          = fmap (u . v) w
 | 
				
			||||||
          = pure (.) <*> u <*> v <*> w =
 | 
					          = pure (.) <*> u <*> v <*> w =
 | 
				
			||||||
        ```
 | 
					        ```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Monad
 | 
				
			||||||
 | 
					=====
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Definition
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```haskell
 | 
				
			||||||
 | 
					class Applicative m => Monad m where
 | 
				
			||||||
 | 
					  return :: a -> m a
 | 
				
			||||||
 | 
					  (>>=)  :: m a -> (a -> m b) -> m b
 | 
				
			||||||
 | 
					  (>>)   :: m a -> m b -> m b
 | 
				
			||||||
 | 
					  m >> n = m >>= \_ -> n
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					  fail   :: String -> m a
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Instances
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```haskell
 | 
				
			||||||
 | 
					instance Monad Maybe where
 | 
				
			||||||
 | 
					  return :: a -> Maybe a
 | 
				
			||||||
 | 
					  return = Just
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					  (>>=) :: Maybe a -> (a -> Maybe b) -> Maybe b
 | 
				
			||||||
 | 
					  (Just x) >>= g = g x
 | 
				
			||||||
 | 
					  Nothing  >>= _ = Nothing
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Exercises
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					1. Implement a `Monad` instance for the list constructor, `[]`. Follow the types!
 | 
				
			||||||
 | 
					   
 | 
				
			||||||
 | 
					   **Solution**:
 | 
				
			||||||
 | 
					   
 | 
				
			||||||
 | 
					    ```haskell
 | 
				
			||||||
 | 
					    instance Monad [] where
 | 
				
			||||||
 | 
					      return a = [a]
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					      [] >> _ = []
 | 
				
			||||||
 | 
					      (x:xs) >>= f = f x : xs >>= f
 | 
				
			||||||
 | 
					    ```
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					2. Implement a `Monad` instance for `((->) e)`.
 | 
				
			||||||
 | 
					   
 | 
				
			||||||
 | 
					   **Solution**:
 | 
				
			||||||
 | 
					   
 | 
				
			||||||
 | 
					    ```haskell
 | 
				
			||||||
 | 
					    instance Monad ((->) e) where
 | 
				
			||||||
 | 
					      return x = const x
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					      g >>= f = f . g
 | 
				
			||||||
 | 
					    ```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					3. Implement `Functor` and `Monad` instance for `Free f`, defined as:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ```haskell
 | 
				
			||||||
 | 
					    data Free f a = Var a
 | 
				
			||||||
 | 
					                  | Node (f (Free f a))
 | 
				
			||||||
 | 
					    ```
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    You may assume that `f` has a `Functor` instance. This is known as the _free monad_ built from the functor f. 
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    **Solution**:
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    ```haskell
 | 
				
			||||||
 | 
					    instance Functor (Free f) where
 | 
				
			||||||
 | 
					      fmap f (Var a) = Var (f a)
 | 
				
			||||||
 | 
					      fmap f (Node x) = Node (f x)
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					    instance Monad (Free f) where
 | 
				
			||||||
 | 
					      return x = Var x
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					      (Var x) >>= f = Var (f x)
 | 
				
			||||||
 | 
					      (Node x) >>= f = Node (fmap f x)
 | 
				
			||||||
 | 
					    ```
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user