aboutsummaryrefslogtreecommitdiff
path: root/Haskell-book/18/Instance/src/PhhhbbtttEither.hs
diff options
context:
space:
mode:
authorEugen Wissner <belka@caraus.de>2025-12-11 10:28:11 +0100
committerEugen Wissner <belka@caraus.de>2025-12-11 10:28:11 +0100
commit98329e0a3dd4f78b5d815ac3896272ec70904901 (patch)
tree80f9c56cfe2ac20232358f236d32e84bd683be1b /Haskell-book/18/Instance/src/PhhhbbtttEither.hs
parent3624c712d72d246f21d4e710cec7c11e052e0326 (diff)
downloadbook-exercises-98329e0a3dd4f78b5d815ac3896272ec70904901.tar.gz
Add remaining haskell book exercises
Diffstat (limited to 'Haskell-book/18/Instance/src/PhhhbbtttEither.hs')
-rw-r--r--Haskell-book/18/Instance/src/PhhhbbtttEither.hs38
1 files changed, 38 insertions, 0 deletions
diff --git a/Haskell-book/18/Instance/src/PhhhbbtttEither.hs b/Haskell-book/18/Instance/src/PhhhbbtttEither.hs
new file mode 100644
index 0000000..0fc6acc
--- /dev/null
+++ b/Haskell-book/18/Instance/src/PhhhbbtttEither.hs
@@ -0,0 +1,38 @@
+{-# LANGUAGE NoImplicitPrelude #-}
+module PhhhbbtttEither where
+
+import Prelude ( Monad(..)
+ , Functor(..)
+ , Applicative(..)
+ , Eq(..)
+ , ($)
+ , Show(..) )
+import Test.QuickCheck
+import Test.QuickCheck.Checkers
+
+data PhhhbbtttEither b a =
+ Left a
+ | Right b
+ deriving (Eq, Show)
+
+instance Functor (PhhhbbtttEither b) where
+ fmap f (Right x) = Right x
+ fmap f (Left x) = Left $ f x
+
+instance Applicative (PhhhbbtttEither b) where
+ pure x = Left x
+ Right f <*> _ = Right f
+ Left f <*> x = fmap f x
+
+instance Monad (PhhhbbtttEither b) where
+ return = pure
+ (Right x) >>= f = Right x
+ (Left x) >>= f = f x
+
+instance (Arbitrary a, Arbitrary b) => Arbitrary (PhhhbbtttEither b a) where
+ arbitrary = frequency [ (1, fmap Right arbitrary)
+ , (1, fmap Left arbitrary)
+ ]
+
+instance (Eq a, Eq b) => EqProp (PhhhbbtttEither b a) where
+ (=-=) = eq