Explicación del functor aplicativo en términos categóricos - functores monoidales

40

Me gustaría entender Applicativeen términos de teoría de categorías.

La documentación de Applicativedice que es un functor monoidal fuerte y laxo .

Primero, la página de Wikipedia sobre los functores monoidales dice que un functor monoidal es laxo o fuerte . Entonces, me parece que una de las fuentes está equivocada o usan los términos de manera diferente. ¿Alguien puede explicar eso?

Segundo, ¿cuáles son las categorías monoidales de las cuales Applicativeson functores monoidales? Supongo que los functores son endofunctores en la categoría estándar de Haskell (objetos = tipos, morfismos = funciones), pero no tengo idea de cuál es la estructura monoidal en esta categoría.

Gracias por la ayuda.

Petr Pudlák
fuente

Respuestas:

35

En realidad, hay dos usos de la palabra "fuerza" en juego aquí.

  • Un endofunctor fuerte sobre una categoría monoidal ( C , , I ) es uno que viene con una transformación natural σ : A F ( B ) F ( A B ) , satisfaciendo algunas condiciones de coherencia con respecto a el asociador que pasaré por alto. Esta condición a veces también se pronuncia " F tiene una fuerza".F:dodo(do,,yo)σ:UNAF(si)F(UNAsi)F

  • Un functor monoidal laxo es un functor entre dos categorías monoidales ( C , , I ) y ( D , , J ) con transformaciones naturales ϕ : F ( A ) F ( B ) F ( A B ) y i : J F ( I )F:dore(do,,yo)(re,,J)ϕ:F(UNA)F(si)F(UNAsi)yo:JF(yo), nuevamente satisfaciendo una condición de coherencia con respecto a los asociadores.

  • Un functor monoidal fuerte es uno en el que ϕ e i son isomorfismos naturales. Es decir, F ( A B ) F ( A ) F ( B ) , con ϕ y su inverso que describe el isomorfismo.F:doreϕyoF(UNAsi)F(UNA)F(si)ϕ

Un functor aplicativo, en el sentido de los programas Haskell, es un endofunctor monoidal laxo con una resistencia , siendo la estructura monoidal en cuestión los productos cartesianos. Por eso se obtiene el término de sonido paradójico "functor monoidal fuerte y laxo".

Por otro lado, en una categoría cerrada cartesiana, tener una fuerza es equivalente a la existencia de una transformación natural m a p : ( A B ) ( F ( A ) F ( B ) ) . Es decir, tener una fuerza significa que la acción functorial se puede definir como una función de orden superior en el lenguaje de programación.Fmetrounapags:(UNAsi)(F(UNA)F(si))

Finalmente, si está interesado en la teoría de tipos de los fundores aplicativos de estilo Haskell, acabo de bloguear al respecto.

Neel Krishnaswami
fuente
1
Gracias por la respuesta. ¿Entiendo correctamente que todas las instancias Functortienen una fuerza (producto WRT), simplemente porque se definen usando fmapel lenguaje? Además, lo que me desconcierta es que su definición de y yo se invierte en comparación con su publicación de blog y el artículo de Wikipedia : ¿es un error tipográfico? Traté de definir el uso como , que claramente necesita . ϕyopureipure' = \v -> fmap (\() -> v) (i ())i :: (Applicative f) => () -> f ()
Petr Pudlák
1
Tenía un error tipográfico en esta respuesta, ahora corregido. Y sí, todas las instancias de Functorson fuertes (producto wrt).
Neel Krishnaswami
¿Podría por favor también explicar dónde se encuentra Monad? Si entiendo bien, también es un endofunctor monoidal.
egdmitry
Hask
¿Puedo proponerme usar la palabra fuerte para evitar un choque de notación con "fuerte"? Es una variación dialectal escocesa (muy particularmente aquí) de "fuerte", utilizada por primera vez en la Biblia de Wycliffe.
Fosco
3

Para entender Aplicativo, como lo induce una mónada, quiero señalar la siguiente construcción:

FUNAnorteunat(Hometro(UNA,si),Fsi)

una(solF(sol)(una))
FUNAsiUNAFsi.
FUNAFUNA
FUNAFsiUNAFFsi.
FFsiFsi
FsiUNAFUNAFsi,
LyoFtMETRO2 yore
Nikolaj-K
fuente