diff options
author | Vincent Ambo <mail@tazj.in> | 2021-12-13T22·51+0300 |
---|---|---|
committer | Vincent Ambo <mail@tazj.in> | 2021-12-13T23·15+0300 |
commit | 019f8fd2113df4c5247c3969c60fd4f0e08f91f7 (patch) | |
tree | 76a857f61aa88f62a30e854651e8439db77fd0ea /users/wpcarro/scratch/haskell-programming-from-first-principles/composing-types.hs | |
parent | 464bbcb15c09813172c79820bcf526bb10cf4208 (diff) | |
parent | 6123e976928ca3d8d93f0b2006b10b5f659eb74d (diff) |
subtree(users/wpcarro): docking briefcase at '24f5a642' r/3226
git-subtree-dir: users/wpcarro git-subtree-mainline: 464bbcb15c09813172c79820bcf526bb10cf4208 git-subtree-split: 24f5a642af3aa1627bbff977f0a101907a02c69f Change-Id: I6105b3762b79126b3488359c95978cadb3efa789
Diffstat (limited to 'users/wpcarro/scratch/haskell-programming-from-first-principles/composing-types.hs')
-rw-r--r-- | users/wpcarro/scratch/haskell-programming-from-first-principles/composing-types.hs | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/users/wpcarro/scratch/haskell-programming-from-first-principles/composing-types.hs b/users/wpcarro/scratch/haskell-programming-from-first-principles/composing-types.hs new file mode 100644 index 000000000000..378cfb7ceae6 --- /dev/null +++ b/users/wpcarro/scratch/haskell-programming-from-first-principles/composing-types.hs @@ -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) |