aboutsummaryrefslogtreecommitdiff
path: root/Haskell-book/25/Twinplicative/src
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/25/Twinplicative/src
parent3624c712d72d246f21d4e710cec7c11e052e0326 (diff)
downloadbook-exercises-98329e0a3dd4f78b5d815ac3896272ec70904901.tar.gz
Add remaining haskell book exercises
Diffstat (limited to 'Haskell-book/25/Twinplicative/src')
-rw-r--r--Haskell-book/25/Twinplicative/src/Twinplicative.hs42
1 files changed, 42 insertions, 0 deletions
diff --git a/Haskell-book/25/Twinplicative/src/Twinplicative.hs b/Haskell-book/25/Twinplicative/src/Twinplicative.hs
new file mode 100644
index 0000000..f8840fa
--- /dev/null
+++ b/Haskell-book/25/Twinplicative/src/Twinplicative.hs
@@ -0,0 +1,42 @@
+{-# LANGUAGE InstanceSigs #-}
+module Twinplicative where
+
+newtype Identity a
+ = Identity { runIdentity :: a }
+
+instance Functor Identity where
+ fmap f (Identity a) = Identity (f a)
+
+newtype Compose f g a =
+ Compose { getCompose :: f (g a) }
+ deriving (Eq, Show)
+
+instance (Functor f, Functor g) =>
+ Functor (Compose f g) where
+ fmap f (Compose fga) =
+ Compose $ (fmap . fmap) f fga
+
+-- instance types provided as they may help.
+instance (Applicative f, Applicative g)
+ => Applicative (Compose f g) where
+ pure :: a -> Compose f g a
+ pure x = Compose $ (pure . pure) x
+
+ (<*>) :: Compose f g (a -> b)
+ -> Compose f g a
+ -> Compose f g b
+ (Compose f) <*> (Compose a) = Compose $ (fmap (<*>) f) <*> a
+
+
+instance (Foldable f, Foldable g) =>
+ Foldable (Compose f g) where
+ foldMap f (Compose fga) =
+ (foldMap . foldMap) f fga
+
+instance (Traversable f, Traversable g) =>
+ Traversable (Compose f g) where
+ traverse :: Applicative f1 => (a -> f1 b)
+ -> Compose f g a
+ -> f1 (Compose f g b)
+ traverse f (Compose fga) =
+ Compose <$> (traverse . traverse) f fga \ No newline at end of file