Lucky for you, Mountain View has Haskell startups!
newtype Example f c a b = Example (f (c a b))
instance (Applicative f, Category c) => Category (Example f c) where
id = Example (pure id)
Example f . Example g = Example (liftA2 (.) f g)
You can prove that if `c` satisfies the `Category` laws and `f` satisfies the `Applicative` laws, then `Example f c` also satisfies the `Category` laws. >>> let showAdd x y = show (x + y)
>>> :type showAdd
showAdd :: (Num a, Show a) => a -> a -> String
The compiler infers: