Skip to content

Add `Monad (Compose m t)`

Motivation

Monad is not closed under Compose generally, but if t is Traversable, m . t is Monad for any Monad m. Thus, I propose to add an instance Monad (Compose m t) in Data.Functor.Compose.

Proposal

Add the following code in Data.Functor.Compose.

(>>=.) :: (Monad m, Monad t, Traversable t) => m (t a) -> (a -> m (t b)) -> m (t b)
x >>=. f = x >>= (<$>) join . mapM f

instance (Monad m, Monad t, Traversable t) => Monad (Compose m t) where
  (Compose c) >>= f = Compose $ c >>=. (getCompose . f)
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information