Complete the Monad chapter
From "Haskell Programming from First Principles"... I have completed all of the exercises in the book thus far, but I only recently dedicated a Haskell module for each chapter. Previously I created ad hoc modules per exercise, per chapter... it was chaotic.
This commit is contained in:
		
							parent
							
								
									71e79f5f5d
								
							
						
					
					
						commit
						a981bb0d4a
					
				
					 1 changed files with 178 additions and 0 deletions
				
			
		
							
								
								
									
										178
									
								
								scratch/haskell-programming-from-first-principles/monad.hs
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										178
									
								
								scratch/haskell-programming-from-first-principles/monad.hs
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,178 @@ | |||
| module MonadScratch where | ||||
| 
 | ||||
| import Data.Function ((&)) | ||||
| import Test.QuickCheck | ||||
| import Test.QuickCheck.Checkers | ||||
| import Control.Applicative (liftA2) | ||||
| import qualified Control.Monad as Monad | ||||
| 
 | ||||
| -------------------------------------------------------------------------------- | ||||
| 
 | ||||
| bind :: Monad m => (a -> m b) -> m a -> m b | ||||
| bind f x = Monad.join $ fmap f x | ||||
| 
 | ||||
| -------------------------------------------------------------------------------- | ||||
| 
 | ||||
| fTrigger :: Functor f => f (Int, String, [Int]) | ||||
| fTrigger = undefined | ||||
| 
 | ||||
| aTrigger :: Applicative a => a (Int, String, [Int]) | ||||
| aTrigger = undefined | ||||
| 
 | ||||
| mTrigger :: Monad m => m (Int, String, [Int]) | ||||
| mTrigger = undefined | ||||
| 
 | ||||
| -------------------------------------------------------------------------------- | ||||
| 
 | ||||
| data Sum a b | ||||
|   = Fst a | ||||
|   | Snd b | ||||
|   deriving (Eq, Show) | ||||
| 
 | ||||
| instance (Eq a, Eq b) => EqProp (Sum a b) where | ||||
|   (=-=) = eq | ||||
| 
 | ||||
| instance (Arbitrary a, Arbitrary b) => Arbitrary (Sum a b) where | ||||
|   arbitrary = frequency [ (1, Fst <$> arbitrary) | ||||
|                         , (1, Snd <$> arbitrary) | ||||
|                         ] | ||||
| 
 | ||||
| instance Functor (Sum a) where | ||||
|   fmap f (Fst x) = Fst x | ||||
|   fmap f (Snd x) = Snd (f x) | ||||
| 
 | ||||
| instance Applicative (Sum a) where | ||||
|   pure x = Snd x | ||||
|   (Snd f) <*> (Snd x) = Snd (f x) | ||||
|   (Snd f) <*> (Fst x) = Fst x | ||||
|   (Fst x) <*> _ = Fst x | ||||
| 
 | ||||
| instance Monad (Sum a) where | ||||
|   (Fst x) >>= _ = Fst x | ||||
|   (Snd x) >>= f = f x | ||||
| 
 | ||||
| -------------------------------------------------------------------------------- | ||||
| 
 | ||||
| data Nope a = NopeDotJpg deriving (Eq, Show) | ||||
| 
 | ||||
| instance Arbitrary (Nope a) where | ||||
|   arbitrary = pure NopeDotJpg | ||||
| 
 | ||||
| instance EqProp (Nope a) where | ||||
|   (=-=) = eq | ||||
| 
 | ||||
| instance Functor Nope where | ||||
|   fmap f _ = NopeDotJpg | ||||
| 
 | ||||
| instance Applicative Nope where | ||||
|   pure _ = NopeDotJpg | ||||
|   _ <*> _ = NopeDotJpg | ||||
| 
 | ||||
| instance Monad Nope where | ||||
|   NopeDotJpg >>= f = NopeDotJpg | ||||
| 
 | ||||
| -------------------------------------------------------------------------------- | ||||
| 
 | ||||
| data BahEither b a | ||||
|   = PLeft a | ||||
|   | PRight b | ||||
|   deriving (Eq, Show) | ||||
| 
 | ||||
| instance (Arbitrary b, Arbitrary a) => Arbitrary (BahEither b a) where | ||||
|   arbitrary = frequency [ (1, PLeft <$> arbitrary) | ||||
|                         , (1, PRight <$> arbitrary) | ||||
|                         ] | ||||
| 
 | ||||
| instance (Eq a, Eq b) => EqProp (BahEither a b) where | ||||
|   (=-=) = eq | ||||
| 
 | ||||
| instance Functor (BahEither b) where | ||||
|   fmap f (PLeft x) = PLeft (f x) | ||||
|   fmap _ (PRight x) = PRight x | ||||
| 
 | ||||
| instance Applicative (BahEither b) where | ||||
|   pure = PLeft | ||||
|   (PRight x) <*> _ = PRight x | ||||
|   (PLeft f) <*> (PLeft x) = PLeft (f x) | ||||
|   _ <*> (PRight x) = PRight x | ||||
| 
 | ||||
| instance Monad (BahEither b) where | ||||
|   (PRight x) >>= _ = PRight x | ||||
|   (PLeft x) >>= f = f x | ||||
| 
 | ||||
| -------------------------------------------------------------------------------- | ||||
| 
 | ||||
| newtype Identity a = Identity a | ||||
|   deriving (Eq, Ord, Show) | ||||
| 
 | ||||
| instance Functor Identity where | ||||
|   fmap f (Identity x) = Identity (f x) | ||||
| 
 | ||||
| instance Applicative Identity where | ||||
|   pure = Identity | ||||
|   (Identity f) <*> (Identity x) = Identity (f x) | ||||
| 
 | ||||
| instance Monad Identity where | ||||
|   (Identity x) >>= f = f x | ||||
| 
 | ||||
| -------------------------------------------------------------------------------- | ||||
| 
 | ||||
| data List a | ||||
|   = Nil | ||||
|   | Cons a (List a) | ||||
|   deriving (Eq, Show) | ||||
| 
 | ||||
| instance Arbitrary a => Arbitrary (List a) where | ||||
|   arbitrary = frequency [ (1, pure Nil) | ||||
|                         , (1, Cons <$> arbitrary <*> arbitrary) | ||||
|                         ] | ||||
| 
 | ||||
| instance Eq a => EqProp (List a) where | ||||
|   (=-=) = eq | ||||
| 
 | ||||
| fromList :: [a] -> List a | ||||
| fromList [] = Nil | ||||
| fromList (x:xs) = Cons x (fromList xs) | ||||
| 
 | ||||
| instance Semigroup (List a) where | ||||
|   Nil <> xs = xs | ||||
|   xs <> Nil = xs | ||||
|   (Cons x xs) <> ys = | ||||
|     Cons x (xs <> ys) | ||||
| 
 | ||||
| instance Functor List where | ||||
|   fmap f Nil = Nil | ||||
|   fmap f (Cons x xs) = Cons (f x) (fmap f xs) | ||||
| 
 | ||||
| instance Applicative List where | ||||
|   pure x = Cons x Nil | ||||
|   Nil <*> _ = Nil | ||||
|   _ <*> Nil = Nil | ||||
|   (Cons f fs) <*> xs = | ||||
|     (f <$> xs) <> (fs <*> xs) | ||||
| 
 | ||||
| instance Monad List where | ||||
|   Nil >>= _ = Nil | ||||
|   (Cons x xs) >>= f = (f x) <> (xs >>= f) | ||||
| 
 | ||||
| -------------------------------------------------------------------------------- | ||||
| 
 | ||||
| j :: Monad m => m (m a) -> m a | ||||
| j = Monad.join | ||||
| 
 | ||||
| l1 :: Monad m => (a -> b) -> m a -> m b | ||||
| l1 = Monad.liftM | ||||
| 
 | ||||
| l2 :: Monad m => (a -> b -> c) -> m a -> m b -> m c | ||||
| l2 = Monad.liftM2 | ||||
| 
 | ||||
| a :: Monad m => m a -> m (a -> b) -> m b | ||||
| a = flip (<*>) | ||||
| 
 | ||||
| meh :: Monad m => [a] -> (a -> m b) -> m [b] | ||||
| meh xs f = flipType $ f <$> xs | ||||
| 
 | ||||
| flipType :: Monad m => [m a] -> m [a] | ||||
| flipType [] = pure mempty | ||||
| flipType (m:ms) = | ||||
|   m >>= (\x -> (x:) <$> flipType ms) | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue