Dan Weston wrote:
newtype O f g a = 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 ...
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.
Yes, but that's only sufficient, not necessary.
Jules and David already pointed out that while every monad comes from an
adjunction, this adjunction usually involves categories different from
Hask. So, there are probably no adjoint functors f and g in Hask such that
[] ~= g `O` f
or
data L a = One a | Cons a (L a) -- non-empty list
L ~= g `O` f
(proof?) Yet, both are monads and the latter is even a comonad.
Moreover, f and g can only commute if they have the same source and
target category (Hask in our case). And even when they don't commute,
the resulting monad could still be a comonad, too.
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.
Alas, I wish I could, but I have virtually no clue about adjoint
functors myself :)
I only know the classic example that conjunction and implication
f a = (a,S)
g b = S -> b
are adjoint
(a,S) -> b = a -> (S -> b)
which is just well-known currying. We get the state monad
(g `O` f) a = S -> (S,a)
and the stream comonad
(f `O` f) a = (S, S -> a)
out of that.
Regards
apfelmus
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe