Vor allem:
Jede Monade ist auch ein anwendbarer Funktor und jeder anwendbare Funktor ist ein Funktor.
Dies gilt im Zusammenhang mit Haskell, aber ( Applicative
als "starker laxer monoidaler Funktor" zu lesen ) im Allgemeinen nicht, aus dem eher trivialen Grund, dass Sie "anwendbare" Funktoren zwischen verschiedenen monoidalen Kategorien haben können, während Monaden (und Comonaden) Endofunktoren sind .
Darüber hinaus ist die Identifizierung Applicative
mit stark laxen monoiden Funktoren leicht irreführend, da zur Rechtfertigung des Namens (und der Typensignatur von (<*>)
) ein Funktor zwischen geschlossenen monoiden Kategorien erforderlich ist, der sowohl die monoide Struktur als auch die interne Hom bewahrt . Dies könnte plausibel als "laxer geschlossener monoidaler Funktor" bezeichnet werden, mit der Ausnahme, dass ein Funktor zwischen monoidalen geschlossenen Kategorien, der eine Eigenschaft beibehält, die andere auf offensichtliche Weise erhält . Da Applicative
in Hask nur Endofunktoren beschrieben werden , deren monoidale Struktur erhalten bleibt, erhalten (,)
ihre Instanzen automatisch viele Eigenschaften, einschließlich ihrer Stärke , die auf diese Weise beseitigt werden können.
Die offensichtliche Verbindung mit Monad
ist wohl ein Artefakt der impliziten Beschränkungen, Applicative
die das Zusammentreffen von Aspekten ihrer jeweiligen monoiden Strukturen bewirken, ein glücklicher Zufall, der die Dualisierung leider nicht überlebt.
So wie eine Comonade auf einer Kategorie eine Monade auf C o p ist , ist ein Oplax-Monoid-Funktor C → D ein lockerer Monoid-Funktor C o p → D o p . Aber H a s k o p ist nicht monoidal geschlossen , und eine Co-Funktion , die keine Funktionsanwendung enthält, verdient den Namen kaum. Das Ergebnis wäre jedenfalls nicht sonderlich interessant:CCo p C→ DCo p→ Do pHa s ko pApplicative
class (Functor f) => CoMonoidal f where
counit :: f () -> ()
cozip :: f (a, b) -> (f a, f b)
Wir könnten uns stattdessen den Begriff "colax closed functor" vorstellen, der viel ähnlicher aussehen würde, Applicative
wenn er existieren würde. Leider ist (meines Wissens) überhaupt keine geschlossene Kategorie: in H a s k entspricht Morphismen b → a in H a s k o p , funktioniert aber nicht als internes Hom dort - da die Pfeile vertauscht sind, wäre stattdessen eine Art Ko-Funktion erforderlich, die wir für H a s k nicht allgemein definieren können .Ha s ko pnewtype Op b a = Op (a -> b)
Ha s kb → aHa s ko pOp b a
Ha s k
Wenn wir einfach so tun, als ob es für "colax closed functors" gäbe , und darüber hinaus so arbeiten würden, wie wir es uns naiv erhoffen, würde eine darauf basierende Zusammenarbeit wahrscheinlich so aussehen:Ha s kApplicative
class (Functor f) => CoApplicative f where
copure :: f a -> a
coap :: (f a -> f b) -> f (a -> b)
Das Hinzufügen duplicate :: f a -> f (f a)
zu copure
würde natürlich zu einer Komonade führen (vorausgesetzt, die Gesetze sind erfüllt). Aber es gibt keine offensichtliche Beziehung zwischen - coap
was auch immer es sein mag - und extend :: (f a -> b) -> f a -> f b
. Vergleicht man die Typen, so zeigt sich, dass die Dualisierung auf unterschiedliche Weise abläuft: Die comonoidalen Strukturen liegen duplicate
und cozip
haben wenig miteinander oder damit zu tun coap
(was wahrscheinlich ohnehin keinen Sinn macht), wohingegen liftA2 (,)
und (<*>)
gleichwertig sind und daraus abgeleitet werden können join
.
Eine andere Möglichkeit der Dualisierung Applicative
, die noch weniger mit Comonaden zu tun hat, besteht darin, kontravariante monoide Funktoren in Betracht zu ziehen:
class (Contravariant f) => ContraMonoidal f where
contraunit :: f a
contrazip :: f a -> f b -> f (Either a b)
Ha s ko pb <~ a
contracurry :: (Either c b <~ a) -> (c <~ (b <~ a))
contraapply :: b -> Either a (a <~ b)
Heins kCoApplicative
In einer monoidal geschlossenen Kategorie, die für die Dualisierung gastfreundlicher ist, haben Sie möglicherweise mehr Glück. Insbesondere glaube ich, dass beide Kleisli (Cont r)
und die gegenüberliegende Kategorie monoidal geschlossen sind, so dass dies ein besserer Kontext sein könnte, um diese Ideen zu untersuchen.