This would be sweet to have:
instance Category cat => Monoid (Join cat a) where
mempty = Join id
Join f `mappend` Join g = Join (f . g)
and where we can define
newtype Kleisli m a b = Kleisli (a -> m b)
deriving via (a ~ b => Join (Kleisli m) a b)
(Monoid)
instance Monad m => Category (Kleisli m)
Applicative (Sum f g)
gistThis is quite cool for
Applicative (Sum f g)
andMonad (Compose f g)