From 0c1f5319e0eb26dd61e0482f4cc41edeba6b83ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ga=C3=ABl=20Depreeuw?= Date: Tue, 5 Jun 2018 19:37:32 +0200 Subject: [PATCH] Fix chapter 25 --- 25-composing-types/25-composing-types.md | 10 ++++++++++ 25-composing-types/25.4-twinplicative.md | 2 -- 25-composing-types/25.6-compose-instances.md | 5 ----- 25-composing-types/src/gotcha.hs | 9 +++++++-- 4 files changed, 17 insertions(+), 9 deletions(-) create mode 100644 25-composing-types/25-composing-types.md delete mode 100644 25-composing-types/25.4-twinplicative.md delete mode 100644 25-composing-types/25.6-compose-instances.md diff --git a/25-composing-types/25-composing-types.md b/25-composing-types/25-composing-types.md new file mode 100644 index 0000000..67fbc7a --- /dev/null +++ b/25-composing-types/25-composing-types.md @@ -0,0 +1,10 @@ +# 25 Composing Types + +## 25.4 Twinplicative + +see [src/gotcha.hs](./src/gotcha.hs) + +## 25.6 Compose Instances + +- see [src/gotcha.hs](./src/gotcha.hs) +- see [src/bifunctor.hs](./src/bifunctor.hs) \ No newline at end of file diff --git a/25-composing-types/25.4-twinplicative.md b/25-composing-types/25.4-twinplicative.md deleted file mode 100644 index 590c251..0000000 --- a/25-composing-types/25.4-twinplicative.md +++ /dev/null @@ -1,2 +0,0 @@ -# GOTCHA! Exercise time -see src/gotcha.hs \ No newline at end of file diff --git a/25-composing-types/25.6-compose-instances.md b/25-composing-types/25.6-compose-instances.md deleted file mode 100644 index 4d709d8..0000000 --- a/25-composing-types/25.6-compose-instances.md +++ /dev/null @@ -1,5 +0,0 @@ -# Exercises: Compose Instances -see src/gotcha.hs - -## Bifunctor -see src/bifunctor.hs \ No newline at end of file diff --git a/25-composing-types/src/gotcha.hs b/25-composing-types/src/gotcha.hs index 017c35f..c8c275a 100644 --- a/25-composing-types/src/gotcha.hs +++ b/25-composing-types/src/gotcha.hs @@ -16,6 +16,11 @@ 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 +myApply :: (Applicative f, Applicative g) + => Compose f g (a -> b) -> Compose f g a -> Compose f g b +myApply (Compose h) (Compose c) = + Compose $ (fmap (<*>) h) <*> c + instance (Applicative f, Applicative g) => Applicative (Compose f g) where pure :: a -> Compose f g a pure a = Compose $ pure (pure a) @@ -39,7 +44,7 @@ instance (Applicative f, Applicative g) => Applicative (Compose f g) where -- Which brings us to: -- :: (<*>) f a = (fmap (<*>) f) <*> a (<*>) :: Compose f g (a -> b) -> Compose f g a -> Compose f g b - (Compose h) <*> (Compose c) = Compose $ + (Compose h) <*> (Compose c) = Compose $ (fmap (<*>) h) <*> c instance (Foldable f, Foldable g) => Foldable (Compose f g) where @@ -53,7 +58,7 @@ instance (Foldable f, Foldable g) => Foldable (Compose f g) where -- (foldMap . foldMap) :: (a -> m) -> f (g a) -> m instance (Traversable f, Traversable g) => Traversable (Compose f g) where - traverse :: Applicative f' => (a -> f' b) -> Compose f g a + traverse :: Applicative f' => (a -> f' b) -> Compose f g a -> f' (Compose f g b) traverse f (Compose fga) = Compose <$> ((traverse . traverse) f fga)