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: C→ C( C, ⊗ , yo)σ: A ⊗ F( B ) → F( A ⊗ B )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: C→ D( C, ⊗ , yo)( D , ⊕ , J)ϕ : F( A ) ⊕ F( B ) → F( A ⊗ B )i : J→ F( 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: C→ DϕyoF( A ⊗ B ) ≃ F( A ) ⊕ F( B )ϕ
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.Fm a p :(A⇒B)→(F( A ) ⇒ F( B ) )
Finalmente, si está interesado en la teoría de tipos de los fundores aplicativos de estilo Haskell, acabo de bloguear al respecto.
Functor
tienen una fuerza (producto WRT), simplemente porque se definen usandofmap
el 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 .pure
i
pure' = \v -> fmap (\() -> v) (i ())
i :: (Applicative f) => () -> f ()