[Haskell-cafe] Monads that are Comonads and the role of Adjunction

Dan Weston westondan at imageworks.com
Thu Dec 13 14:30:13 EST 2007

apfelmus wrote:
> Luke Palmer wrote:
>> Isn't a type which is both a Monad and a Comonad just Identity?
>> (I'm actually not sure, I'm just conjecting)
> Good idea, but it's not the case.
>   data L a = One a | Cons a (L a)   -- non-empty list

Maybe I can entice you to elaborate slightly. From
http://www.eyrie.org/~zednenem/2004/hsce/Control.Functor.html and 
Control.Comonad.html there is

newtype O f g a   -- Functor composition:  f `O` g

instance (Functor f, Functor g) => Functor (O f g) where ...
instance Adjunction f g         => Monad   (O g f) where ...
instance Adjunction f g         => Comonad (O f g) where ...

-- I assume Haskell can infer Functor (O g f) from Monad (O g f), which
-- is why that is missing here?

class (Functor f, Functor g) => Adjunction f g | f -> g, g -> f where
   leftAdjunct  :: (f a -> b) -> a -> g b
   rightAdjunct :: (a -> g b) -> f a -> b

Functors are associative but not generally commutative. Apparently a 
Monad is also a Comonad if there exist left (f) and right (g) adjuncts 
that commute. [and only if also??? Is there a contrary example of a 
Monad/Comonad for which no such f and g exist?]

In the case of
 >   data L a = One a | Cons a (L a)   -- non-empty list

what are the appropriate definitions of leftAdjunct and rightAdjunct? 
Are they Monad.return and Comonad.extract respectively? That seems to 
unify a and b unnecessarily. Do they wrap bind and cobind? Are they of 
any practical utility?

My category theory study stopped somewhere between Functor and 
Adjunction, but is there any deep magic you can describe here in a 
paragraph or two? I feel like I will never get Monad and Comonad until I 
understand Adjunction.


More information about the Haskell-Cafe mailing list