Partially complete some of the exercises for Composing Types
I believe there are two exercises sets in the "Composing Types" chapter. Here are *some* of my answers so far... I'm having trouble implementing Foldable for Compose. I was able to implement a version of it by adding the (Functor f) constraint to the instance signature, but I think I cheated. I will revisit these problems as well as the earlier exercises later.
This commit is contained in:
parent
5e81144622
commit
3665ea457b
1 changed files with 75 additions and 0 deletions
|
@ -0,0 +1,75 @@
|
||||||
|
module ComposingTypesScratch where
|
||||||
|
|
||||||
|
import Data.Function ((&))
|
||||||
|
import Data.Bifunctor
|
||||||
|
|
||||||
|
import qualified Data.Foldable as F
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
newtype Identity a =
|
||||||
|
Identity { getIdentity :: a }
|
||||||
|
deriving (Eq, Show)
|
||||||
|
|
||||||
|
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 getCompose) = Compose $ (fmap . fmap) f getCompose
|
||||||
|
|
||||||
|
instance (Applicative f, Applicative g) => Applicative (Compose f g) where
|
||||||
|
pure x = x & pure & pure & Compose
|
||||||
|
fgf <*> fga = undefined
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
instance (Foldable f, Foldable g) => Foldable (Compose f g) where
|
||||||
|
foldMap toMonoid x = undefined
|
||||||
|
|
||||||
|
instance (Traversable f, Traversable g) => Traversable (Compose f g) where
|
||||||
|
traverse = undefined
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
data Deux a b = Deux a b deriving (Show, Eq)
|
||||||
|
|
||||||
|
instance Bifunctor Deux where
|
||||||
|
bimap f g (Deux x y) = Deux (f x) (g y)
|
||||||
|
|
||||||
|
data Const a b = Const a deriving (Show, Eq)
|
||||||
|
|
||||||
|
instance Bifunctor Const where
|
||||||
|
bimap f _ (Const x) = Const (f x)
|
||||||
|
|
||||||
|
data Drei a b c = Drei a b c deriving (Show, Eq)
|
||||||
|
|
||||||
|
instance Bifunctor (Drei a) where
|
||||||
|
bimap f g (Drei x y z) = Drei x (f y) (g z)
|
||||||
|
|
||||||
|
data SuperDrei a b c = SuperDrei a b deriving (Show, Eq)
|
||||||
|
|
||||||
|
instance Bifunctor (SuperDrei a) where
|
||||||
|
bimap f g (SuperDrei x y) = SuperDrei x (f y)
|
||||||
|
|
||||||
|
data SemiDrei a b c = SemiDrei a deriving (Show, Eq)
|
||||||
|
|
||||||
|
instance Bifunctor (SemiDrei a) where
|
||||||
|
bimap _ _ (SemiDrei x) = SemiDrei x
|
||||||
|
|
||||||
|
data Quadriceps a b c d = Quadzzz a b c d
|
||||||
|
|
||||||
|
instance Bifunctor (Quadriceps a b) where
|
||||||
|
bimap f g (Quadzzz w x y z) = Quadzzz w x (f y) (g z)
|
||||||
|
|
||||||
|
-- | Analogue for Either
|
||||||
|
data LeftRight a b
|
||||||
|
= Failure a
|
||||||
|
| Success b
|
||||||
|
deriving (Show, Eq)
|
||||||
|
|
||||||
|
instance Bifunctor LeftRight where
|
||||||
|
bimap f _ (Failure x) = Failure (f x)
|
||||||
|
bimap _ g (Success y) = Success (g y)
|
Loading…
Reference in a new issue