Esto no marca la verificación porque la clase Adjunction
solo representa un pequeño subconjunto de adjuntos, donde ambos functores son endofunctores en Hask .
Resulta que este no es el caso para el adjunto (<-:) r -| (<-:) r
. Aquí hay dos functores sutilmente diferentes:
f = (<-:) r
, el functor de Hask a Op (Hask) (la categoría opuesta de Hask, a veces también denotada Hask ^ op)
g = (<-:) r
, el functor de Op (Hask) a Hask
En particular, counit
debería ser una transformación natural en la categoría Op (Hask), que mueve las flechas:
unit :: a -> g (f a)
counit :: f (g a) <-: a
De hecho, counit
coincide con unit
este adjunto.
Para capturar esto correctamente, necesitamos generalizar las clases Functor
y Adjunction
para poder modelar adjuntos entre diferentes categorías:
class Exofunctor c d f where
exomap :: c a b -> d (f a) (f b)
class
(Exofunctor d c f, Exofunctor c d g) =>
Adjunction
(c :: k -> k -> Type)
(d :: h -> h -> Type)
(f :: h -> k)
(g :: k -> h) where
unit :: d a (g (f a))
counit :: c (f (g a)) a
Luego obtenemos nuevamente que Compose
es una mónada (y una comonad si volteamos el adjunto):
newtype Compose f g a = Compose { unCompose :: f (g a) }
adjReturn :: forall c f g a. Adjunction c (->) f g => a -> Compose g f a
adjReturn = Compose . unit @_ @_ @c @(->)
adjJoin :: forall c f g a. Adjunction c (->) f g => Compose g f (Compose g f a) -> Compose g f a
adjJoin = Compose . exomap (counit @_ @_ @c @(->)) . (exomap . exomap @(->) @c) unCompose . unCompose
y Cont
es simplemente un caso especial de eso:
type Cont r = Compose ((<-:) r) ((<-:) r)
Consulte también este resumen para obtener más detalles: https://gist.github.com/Lysxia/beb6f9df9777bbf56fe5b42de04e6c64
He leído que, dado un par de adjuntos, forman una mónada y una comonad únicas, pero si se le da una mónada, se puede factorizar en múltiples factores. ¿Hay algún ejemplo de esto?
La factorización generalmente no es única. Una vez que haya generalizado los adjuntos como se mencionó anteriormente, puede al menos factorizar cualquier mónada M
como un adjunto entre su categoría Kleisli y su categoría base (en este caso, Hask).
Every monad M defines an adjunction
F -| G
where
F : (->) -> Kleisli M
: Type -> Type -- Types are the objects of both categories (->) and Kleisli m.
-- The left adjoint F maps each object to itself.
: (a -> b) -> (a -> M b) -- The morphism mapping uses return.
G : Kleisli M -> (->)
: Type -> Type -- The right adjoint G maps each object a to m a
: (a -> M b) -> (M a -> M b) -- This is (=<<)
No sé si la mónada de continuación corresponde a un complemento entre endofunctores en Hask.
Consulte también el artículo de nCatLab sobre mónadas: https://ncatlab.org/nlab/show/monad#RelationToAdjunctionsAndMonadicity
Relación con adjunciones y monadicidad.
Cada adjunto (L ⊣ R) induce una mónada R∘L y una comonad L∘R. En general, hay más de un complemento que da lugar a una mónada determinada de esta manera, de hecho, hay una categoría de adjuntos para una mónada determinada. El objeto inicial en esa categoría es el complemento sobre la categoría Kleisli de la mónada y el objeto terminal es sobre la categoría de álgebras de Eilenberg-Moore. (por ejemplo, Borceux, vol. 2, prop. 4.2.2) Este último se llama adjunto monádico.