On Sun, 2007-12-16 at 13:49 +0100, apfelmus wrote: > 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 :)
Learn about representability. Representability is the core of category theory. (Though, of course, it is closely related to adjunctions.) > 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. There is another very closely related adjunction that is less often mentioned. ((-)->C)^op -| (-)->C or a -> b -> C ~ b -> a -> C This gives rise to the monad, M a = (a -> C) -> C this is also exactly the comonad it gives rise to (in the op category which ends up being the above monad in the "normal" category). _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe