Toute monade est également un foncteur applicatif et tout foncteur applicatif est un foncteur. De plus, tout comonad est un foncteur. Existe-t-il un concept similaire entre les comonades et les foncteurs, quelque chose comme le foncteur co-applicatif, et quelles sont ses propriétés?
Mise à jour: je serais également intéressé par les utilisations possibles d'un tel concept.
ct.category-theory
monad
applicative
comonad
Petr Pudlák
la source
la source
Réponses:
Tout d'abord:
Cela est vrai dans le contexte de Haskell, mais (à lire
Applicative
comme "foncteur monoïdal fort laxiste") pas en général, pour la raison plutôt banale que vous pouvez avoir des foncteurs "applicatifs" entre différentes catégories monoïdales, alors que les monades (et les comonades) sont des endofuncteurs .De plus, l'identification
Applicative
avec des foncteurs monoïdaux laxistes forts est légèrement trompeuse, car pour justifier le nom (et la signature de type de(<*>)
), il faut un foncteur entre les catégories monoïdales fermées qui préserve à la fois la structure monoïdale et le hom interne . On pourrait vraisemblablement appeler cela un "foncteur monoïdal fermé laxiste", sauf qu'un foncteur entre catégories fermées monoïdales qui préserve l'une ou l'autre propriété préserve l'autre de façon évidente . ParceApplicative
que ne décrit que les endofoncteurs sur Hask préservant la structure monoïdale de(,)
, ses instances acquièrent automatiquement de nombreuses propriétés, y compris leur résistance , qui peuvent ainsi être élidées.Le lien apparent avec
Monad
est sans doute un artefact des limitations implicites àApplicative
faire coïncider des aspects de leurs structures monoïdes respectives, une heureuse coïncidence qui, malheureusement, ne survit pas à la dualisation.Tout comme une comonade sur une catégorie est une monade sur , un foncteur monoïde oplax est un foncteur monoïde laxiste . Mais n'est pas monoïdal fermé , et un co- qui n'inclut pas d'application de fonction mérite à peine le nom. De toute façon, le résultat ne serait pas terriblement intéressant:C Co p C→ D Co p→ Do p Ha s ko p
Applicative
On pourrait plutôt imaginer une notion de "colax fermé fonctor", qui ressemblerait beaucoup plus à l'Ha s ko p Ha s k b → a Ha s ko p Ha s k
Applicative
existence. Malheureusement, n'est pas (à ma connaissance) une catégorie fermée du tout: dans correspond aux morphismes dans , mais ne fonctionne pas comme un hom interne là-bas - parce que les flèches sont inversées, une sorte de co-fonction serait nécessaire à la place, que nous ne pouvons pas définir en général pour .newtype Op b a = Op (a -> b)
Op b a
Si nous prétendons simplement que des "foncteurs fermés colax" existent pour , et que nous travaillons en outre de la manière que nous espérions naïvement, un co- basé sur cela ressemblerait probablement à ceci:Ha s k
Applicative
Ajouter
duplicate :: f a -> f (f a)
àcopure
produirait une comonade (en supposant que les lois soient satisfaites), bien sûr. Mais il n'y a pas de relation évidente entre -coap
quoi que ce soit - etextend :: (f a -> b) -> f a -> f b
. En comparant les types, il devient clair que la dualisation se produit de différentes manières: les structures comonoïdales sousduplicate
- jacentes etcozip
peu liées les unes aux autres ou aveccoap
(ce qui n'a probablement aucun sens de toute façon), tandis queliftA2 (,)
et(<*>)
sont équivalentes et peuvent être dérivées dejoin
.Une autre façon possible de dualiser
Applicative
, qui a encore moins à voir avec les comonades, est de considérer les foncteurs monoïdes contravariants:Mais cela va à l'encontre des mêmes problèmes que ci-dessus, à savoir que n'est pas une catégorie fermée. Si elle était, nous aurions un certain type de telle sorte que nous pourrions écrire des fonctions comme et et ainsi de suite qui fonctionnait vraiment comme prévu.Ha s ko p
b <~ a
contracurry :: (Either c b <~ a) -> (c <~ (b <~ a))
contraapply :: b -> Either a (a <~ b)
Si ma mémoire est bonne, les obstacles ici ne sont pas spécifiques à Haskell, mais découlent plutôt du fait que est fermé cartésien (jusqu'à l'ondulation habituelle, bien sûr), une propriété qu'il partage avec la plupart des calculs lambda typés, donc vous n'êtes pas susceptible d'aller très loin avec un dans la plupart des paramètres.Ha s k
CoApplicative
Cependant, dans une catégorie fermée monoïdale plus hospitalière à la dualisation, vous pourriez avoir plus de chance. En particulier, je crois que les deux
Kleisli (Cont r)
et sa catégorie opposée sont monoïdales fermées, ce qui pourrait être un meilleur contexte pour explorer ces idées.la source
Dans cet article sur SO, j'ai trouvé une réponse intéressante - des foncteurs décisifs . Si nous remplaçons
()
parVoid
,(,)
parEither
et inversons les flèches, nous obtenons:Le billet de blog donne également quelques lois auxquelles adhèrent les foncteurs décisifs.
Et, tout
Comonad
est aussiDecisive
:Les foncteurs décisifs se situent donc entre les foncteurs et les comonades, tout comme les foncteurs applicatifs se situent entre les foncteurs et les monades.
la source
McBride et Patterson (section 7) montrent qu'un foncteur applicatif, également connu sous le nom d'idiome, est un foncteur monoïde fort laxiste . Vous êtes à la recherche d'un puissant foncteur monoïde colax également connu sous le nom de foncteur monoïde oplax fort . Comme mentionné dans un commentaire, un foncteur monoïde oplax est un foncteur monoïde laxiste entre les catégories opposées, ce qui finit par être une version comonoïdale d'un foncteur monoïde laxiste.
Dessinez les diagrammes, inversez les flèches!
Je devrais passer un peu de temps à travailler sur les détails pour voir de quoi il s'agit et à le traduire en une notion de programmation fonctionnelle.
la source