Category Theory for Programmers Chapter 8: Functoriality
Last chapter was about functors, but this is about how we can make them useful. In particular, combining functors via bifunctors. A reminder of what a bifunctor is:
class Bifunctor f where
bimap :: (a > c) > (b > d) > f a b > f c d
bimap g h = first g . second h
first :: (a > c) > f a b > f c b
first g = bimap g id
second :: (b > d) > f a b > f a d
second = bimap id

Show the data type
data Pair a b = Pair a b
is a bifunctor. Specifically, we show that ifa
orb
is a functor, thenPair
is a functor ifinstance Bifunctor (Pair a b) where bimap f g (Pair a b) = Pair (f a) (g b)

Show isomorphism between
Maybe
andtype Maybe' a = Either (Const () a) (Identity a)
maybeToEither :: Maybe a > Maybe' a maybeToEither Nothing = Left (Const ()) maybeToEither (Just x) = Right (Identity x) eitherToMaybe :: Maybe' a > Maybe a eitherToMaybe (Left _) = Nothing eitherToMaybe (Right (Identity x)) = Just x

Show that
PreList
is an instance ofBifunctor
,data PreList a b = Nil  Cons a b
Let’s make this look like some things we know are functors and bifunctors already.
data PreList a b = Maybe (a, b) = Either (Const () c) (Identity a, Identity b)
I don’t really know where to go with this other than we see it’s functors and bifunctors all the way down. But it’s probably easiest to just implement the interface outright.

Show
K2
,Fst
, andSnd
define bifunctors ina
andb
.interface Bifunctor (K2 c a b) where bimap _ _ (K2 c) = K2 c interface Bifunctor (Fst a b) where bimap f _ (Fst a) = Fst (f a) interface Bifunctor (Snd a b) where bimap _ g (Snd a b) = Snd a (g b)
As for the rest of this, a couple good resources about profunctors are this link and this video.