Cualquier mónada también es un funtor aplicativo y cualquier funtor aplicativo es un ficticio. Además, cualquier comonad es un functor. ¿Existe un concepto similar entre comonads y functors, algo así como un co-aplicador y cuáles son sus propiedades?
Actualización: también me interesarían los posibles usos de dicho concepto.
ct.category-theory
monad
applicative
comonad
Petr Pudlák
fuente
fuente
Respuestas:
Ante todo:
Esto es cierto en el contexto de Haskell, pero (que se lee
Applicative
como "functor monoidal fuerte y laxo") no en general, por la razón bastante trivial de que puede tener functores "aplicativos" entre diferentes categorías monoidales, mientras que las mónadas (y comonads) son endofunctores .Además, la identificación
Applicative
con functores monoidales laxos y fuertes es un poco engañoso, porque para justificar el nombre (y la firma de tipo de(<*>)
) se requiere un functor entre las categorías monoidales cerradas que conserva la estructura monoidal y el hom interno . Esto podría llamarse un "functor monoidal cerrado laxo", excepto que un functor entre categorías cerradas monoidales que conserva cualquiera de las propiedades conserva la otra de la manera obvia . Debido a queApplicative
solo describe los endofunctores en Hask preservando la estructura monoidal(,)
, sus instancias obtienen muchas propiedades automáticamente, incluida su resistencia , que por lo tanto se puede eludir.La conexión aparente con
Monad
es posiblemente un artefacto de las limitaciones implícitas enApplicative
hacer coincidir aspectos de sus respectivas estructuras monoides, una feliz coincidencia que desafortunadamente no sobrevive a la dualización.Así como una comonad en una categoría es una mónada en C o p , un functor monoidal oplax C → D es un functor monoidal laxo C o p → D o p . Pero H a s k o p no está cerrado monoidal , y un co- que no incluye la aplicación de función apenas merece el nombre. De todos modos, el resultado no sería terriblemente interesante:C Cop C→D Co p→ Do p Ha s ko p
Applicative
Applicative
newtype Op b a = Op (a -> b)
Op b a
Applicative
Agregar
duplicate :: f a -> f (f a)
acopure
produciría una comonad (suponiendo que se cumplan las leyes), por supuesto. Pero no hay una relación obvia entre,coap
sea lo que sea, yextend :: (f a -> b) -> f a -> f b
. La comparación de los tipos se hace evidente que la dualización está ocurriendo en diferentes formas: las estructuras comonoidal subyacentesduplicate
ycozip
tienen poco que ver entre sí o concoap
(que probablemente no tiene sentido de todos modos), mientras queliftA2 (,)
y(<*>)
son equivalentes y se pueden derivar dejoin
.Otra posible forma de dualización
Applicative
, que tiene aún menos que ver con comonads, es considerar los functores monoidales contravariantes:b <~ a
contracurry :: (Either c b <~ a) -> (c <~ (b <~ a))
contraapply :: b -> Either a (a <~ b)
CoApplicative
Sin embargo, en una categoría cerrada monoidal más hospitalaria para la dualización, es posible que tenga mejor suerte. En particular, creo que ambos
Kleisli (Cont r)
y su categoría opuesta son cerrados monoidales, por lo que podría ser un mejor contexto para explorar estas ideas.fuente
En esta publicación sobre SO encontré una respuesta interesante: functores decisivos . Si reemplazamos
()
porVoid
,(,)
porEither
e invertimos las flechas, obtenemos:La publicación del blog también ofrece algunas leyes a las que se adhieren los fundadores decisivos.
Y, todo
Comonad
es tambiénDecisive
:De modo que los functores decisivos encajan entre functores y comonads, así como los fundores aplicativos encajan entre functors y mónadas.
fuente
McBride y Patterson (Sección 7) muestran que un functor aplicativo, también conocido como modismo, es un functor monoidal fuerte y laxo . Está buscando un functor monoidal fuerte colax también conocido como un functor monoidal oplax fuerte . Como se menciona en un comentario, un functor monoidal oplax es un functor monoidal laxo entre las categorías opuestas, que termina siendo una versión comonoidal de un functor monoidal lax.
¡Dibuja los diagramas, invierte las flechas!
Tendría que pasar un poco de tiempo resolviendo los detalles para ver cuál es y traducirlo en una noción de programación funcional.
fuente