Vor kurzem habe ich mein Wissen darüber, wie Monaden funktionieren, abgewischt. Ich habe auch auf das Konzept eines eingeführt ‚Comonad‘ , die wie beschrieben wird die inverse Doppel einer Monade . Es ist mir jedoch unmöglich, meinen Kopf darum zu wickeln.
Um Monaden zu verstehen, habe ich mir selbst die Analogie gemacht:
Monaden können als "Blaupause für den Bau von Ausdrucksförderbändern" angesehen werden.
Um eine neue Monade (eine neue Art von Förderbandsystem) zu definieren, müssen Sie Folgendes definieren:
- Eine Möglichkeit, etwas auf ein Förderband zu legen, z. B. ein Förderband zu starten. (Bekannt als
unit
oderreturn
)- Eine Möglichkeit, eine Maschine (einen Ausdruck), die Teil eines Förderbands ist, mit einem Förderband zu verbinden. (Bekannt als
join
oderbind
oder>>=
).(Es gibt eine dritte Operation, bei der das aktuelle Förderband entnommen, der Inhalt weggeworfen und ein neues Förderband gestartet wird, das als bekannt ist
>>
, aber nur sehr selten verwendet wird.)Damit die Maschinen und Förderer ordnungsgemäß zusammenarbeiten, müssen Sie Folgendes sicherstellen:
- Wenn Sie etwas auf ein Förderband legen und es durch eine Maschine laufen lassen, sollte die Ausgabe dieselbe sein, als wenn Sie es manuell durch die Maschine laufen lassen. (Linke Identität)
- Wenn Sie ein Förderband zwischen ein bereits vorhandenes Förderband legen möchten, sollten Sie am Ende kein Förderband mit einem darüberliegenden Förderband haben, sondern ein einzelnes, längeres Förderband. (Richtige Identität)
- Es sollte für die Ausgabe keine Rolle spielen, wenn Sie Maschine A manuell verwenden und das Ergebnis dann durch das mit dem Förderer verbundene BC leiten, oder wenn Sie das mit dem Förderer verbundene AB leiten und das Ergebnis dann manuell durch C. Mit anderen Worten: ((a >> = b) >> = c) sollte dasselbe sein wie (a >> = (b >> = c)) (Assoziativität)
Das einfachste Förderband ist dasjenige, das nur die Eingabe entgegennimmt und immer zum nächsten Ausdruck übergeht. Das ist eine Pipeline.
Eine andere Möglichkeit ist, es nur durch die nächste Maschine laufen zu lassen, wenn eine Bedingung für den Wert erfüllt ist. Dies bedeutet, dass der Rest der Ausdrücke übersprungen wird, wenn sich bei einigen Ausdrücken dazwischen der Wert in etwas ändert, das nicht mehr zulässig ist. Dies ist, was die 'Vielleicht'-Monade in Haskell tut.
Sie können die Werte vor oder nach der Übergabe an einen Computer auch nach anderen Regeln für das bedingte Kopieren / Ändern ändern. Ein Beispiel: Parser (Wenn ein Ausdruck ein "Fehler" -Ergebnis zurückgibt, wird der Wert vor dem Ausdruck als Ausgabe verwendet).
Natürlich ist die Analogie nicht perfekt, aber ich hoffe, sie gibt eine gute Vorstellung davon, wie Monaden funktionieren.
Ich habe jedoch große Schwierigkeiten, diese Analogie auf den Kopf zu stellen, um die Comonaden zu verstehen. Ich weiß aus den kleinen Mengen an Informationen, die ich im Internet gefunden habe, dass eine Comonad definiert:
extract
, Welche Art von der Rückseite istreturn
, das heißt, es nimmt einen Wert aus einer Comonad.duplicate
, das ist eine Art Umkehrung vonjoin
, das heißt, es werden zwei Comonaden aus einer einzigen erstellt.
Aber wie kann eine Comonade instanziiert werden, wenn wir sie nur extrahieren oder duplizieren können? Und wie können sie tatsächlich eingesetzt werden? Ich habe dieses sehr erstaunliche Projekt und die Diskussion darüber gesehen (von denen ich leider sehr wenig verstanden habe), aber ich bin nicht sicher, welcher Teil der Funktionalität von einer Comonad genau bereitgestellt wird.
Was ist eine Comonade? Wofür sind sie nützlich? Wie können sie eingesetzt werden? Sind sie essbar?
IO
Monade ist das Haskell-Laufzeitsystem, das aufruftmain
. Es gibtunsafePerformIO
natürlich auch. Wenn Sie sich dieMaybe
Monade als eine "Maschine am Ende des Förderbands" vorstellen möchten, können Sie sie verwendenmaybe
.cobind
Anwendungskette einen komonadischen Wert erzeugen möchten , muss es eine Funktion geben, die etwas Nützliches mit der internen Darstellung Ihrer Komonade zu tun hat.Antworten:
Eine Komonade ist wie eine Monade eine mathematische Struktur in der Kategorietheorie. Das Co-Präfix ist dort sehr verbreitet, um "Inverse" zu bezeichnen, wie Sie es ausdrücken (obwohl ich glaube, dass reine Mathematiker sich über die Wortwahl nicht einig sind).
In der Kategorietheorie gibt es
categories
, die kurz zusammengefasst eine Sammlung vonobjects
(egal welcher Art, die interne Struktur ist irrelevant) und einigearrows
zwischen diesen Objekten. Damit etwas eine Kategorie sein kann, müssen die Pfeile einigen Gesetzen folgen (links / rechts-Identität und Assoziativität), aber das ist hier nicht wirklich wichtig.Die Kategorietheorie ist sowohl sehr abstrakt als auch sehr umfangreich. Es braucht viel Zeit, um alles durchzuarbeiten (und ich habe es formal nicht studiert, ich kenne nur einige Grundlagen), aber es wird ein Begriff verwendet, der als a bezeichnet wird
dual
. Grundsätzlich kann man für jede Kategorie eine konstruieren,opposite category
indem man einfach das Gleiche tut, aber "alle Pfeile umkehrt". Dies ist eine sehr naive Definition, aber es ist schwer zu versuchen, sie zusammenzufassen. Das Duale von etwas in einer Kategorie C ist im Grunde das Gleiche in der entgegengesetzten Kategorie C_op (Bekommt ihr schon Kopfschmerzen?)Wie auch immer, wenn Sie eine Monade über eine Kategorie haben (und eine Kategorie kann zum Beispiel eine Kategorie sein, in der die Objekte in einer Programmiersprache Typen und die Pfeile Funktionen zwischen den Typen sind), dann ist eine Comonade im Grunde dasselbe, nur Sie Habe alle Pfeile umgekehrt (in diesem Fall ähnlich wie das Umkehren der Funktionssignaturen).
Eine ausführlichere Beschreibung (allerdings nicht SUPER hands-on) finden Sie in dieser Diskussion zwischen Erik Meijer und Brian Beckman, in der sie über den Begriff der Dualität sprechen und darüber, wie Erik
IEnumerable<T>
in C # "die Pfeile umkehren" wollte Schaffung des reaktiven Rahmens undIObservable<T>
(was, soweit ich das beurteilen kann, und ich bin froh, dass ich korrigiert werden kann, im Grunde genommen eine Liste comonad Instanz).Ein weiteres praktisches Beispiel für im Video erwähnte Comonaden ist der
Task<T>
Typ in .NET, bei demTask<U> ContinueWith<U>(Func<Task<T>, U>)
es sich um das Dual vonbind
(oderSelectMany
wie in C # genannt) handelt.quelle
Nach meinem kleinen Verständnis ist ein Comonad ein Rube Goldberg-Computer für die Nachbearbeitung von Dokumenten:
http://www.willamette.edu/~fruehr/haskell/evolution.html
... Entschuldigung, ich konnte nicht widerstehen.
quelle