Was ist eine Comonade und wie sind sie nützlich?


16

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:

  1. Eine Möglichkeit, etwas auf ein Förderband zu legen, z. B. ein Förderband zu starten. (Bekannt als unitoder return)
  2. Eine Möglichkeit, eine Maschine (einen Ausdruck), die Teil eines Förderbands ist, mit einem Förderband zu verbinden. (Bekannt als joinoder bindoder >>=).

(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:

  1. 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)
  2. 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)
  3. 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 ist return, das heißt, es nimmt einen Wert aus einer Comonad.
  • duplicate, das ist eine Art Umkehrung von join, 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?


2
"Wie kann eine Comonade instanziiert werden, wenn wir sie nur extrahieren oder duplizieren können?" - Ich beantworte Ihre Frage mit einer Frage: Wie kann eine Monade konsumiert werden, wenn Sie nur in der Lage sind, Werte in sie zu heben und Berechnungen durchzuführen?
Benjamin Hodgson

1
Die "Maschine am Ende des Förderbands" (abgesehen davon, dass ich Analogien nicht allzu hilfreich finde, wenn es um Monaden geht) der IOMonade ist das Haskell-Laufzeitsystem, das aufruft main. Es gibt unsafePerformIOnatürlich auch. Wenn Sie sich die MaybeMonade als eine "Maschine am Ende des Förderbands" vorstellen möchten, können Sie sie verwenden maybe.
Benjamin Hodgson

1
Wenn Sie jedoch zu Beginn einer cobindAnwendungskette einen komonadischen Wert erzeugen möchten , muss es eine Funktion geben, die etwas Nützliches mit der internen Darstellung Ihrer Komonade zu tun hat.
Benjamin Hodgson

2
Eine bestimmte Instanz von comonad oder monad kann eindeutig mehr Funktionen haben, als nur für die Implementierung der Typenklassen erforderlich sind
jk.

2
Nicht, dass dies hilfreich wäre, wenn Sie sich dieser Frage nicht von der kategorietheoretischen / mathematischen Seite nähern, aber ich wollte darauf hinweisen, dass eine Komonade nicht das Gegenteil, sondern das Doppelte einer Monade ist.
Jörg W Mittag

Antworten:


11

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 von objects(egal welcher Art, die interne Struktur ist irrelevant) und einige arrowszwischen 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 categoryindem 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 und IObservable<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 dem Task<U> ContinueWith<U>(Func<Task<T>, U>)es sich um das Dual von bind(oder SelectManywie in C # genannt) handelt.


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.