it-swarm.com.de

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

Vor kurzem habe ich mein Wissen darüber, wie Monaden funktionieren, abgestaubt. Ich wurde auch in das Konzept einer 'Comonad' eingeführt, die als the beschrieben wird invers Dual einer Monade . Es ist mir jedoch unmöglich, meinen Kopf darum zu wickeln.

Um Monaden zu verstehen, habe ich mir die eigene Analogie gemacht:

Monaden können als "Blaupause zum Bau von Förderbändern für Ausdrucksformen" 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. ein Förderband "starten". (Bekannt als unit oder return)
  2. Eine Möglichkeit, eine Maschine (einen Ausdruck), die Teil eines Förderbandes ist, mit einem Förderband zu verbinden. (Bekannt als join oder bind oder >>=).

(Es gibt eine dritte Operation, bei der das aktuelle Förderband genommen, sein Inhalt weggeworfen und ein neues Förderband namens >> Gestartet wird, das jedoch 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 führen, sollte die Ausgabe dieselbe sein wie beim manuellen Durchlaufen der Maschine. (Linke Identität)
  2. Wenn Sie ein Förderband zwischen ein bereits vorhandenes Förderband legen möchten, sollten Sie kein Förderband mit einem Förderband oben 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 dann das Ergebnis durch das mit dem Förderer verbundene BC weiterleiten oder wenn Sie das mit dem Förderer verbundene AB verwenden und das Ergebnis dann manuell durch C weiterleiten. Mit anderen Worten: ((a >> = b) >> = c) sollte dasselbe sein wie (a >> = (b >> = c)) (Assoziativität)

Das einfachste Förderband wäre dasjenige, das nur die Eingabe übernimmt und immer zum nächsten Ausdruck übergeht. Dies ist, was eine "Pipeline" ist.

Eine andere Möglichkeit besteht darin, es nur dann durch die nächste Maschine laufen zu lassen, wenn eine Bedingung für den Wert erfüllt ist. Dies bedeutet, dass, wenn sich bei einigen dazwischen liegenden Ausdrücken der Wert in etwas ändert, das nicht mehr zulässig ist, der Rest der Ausdrücke übersprungen wird. Dies ist, was die "Vielleicht" -Monade in Haskell tut.

Sie können auch andere ausgefallene bedingte Kopier-/Änderungsregeln für die Werte ausführen, bevor oder nachdem Sie sie an einen Computer übergeben. Ein Beispiel: Parser (Wenn ein Ausdruck ein 'Fehler'-Ergebnis zurückgibt, wird hier der Wert von vor dem Ausdruck als Ausgabe verwendet).

Natürlich ist die Analogie nicht perfekt, aber ich hoffe, sie gibt eine gute Darstellung der Funktionsweise von Monaden.

Ich habe jedoch große Probleme, diese Analogie auf den Kopf zu stellen, um Comonaden zu verstehen. Ich weiß aus den kleinen Mengen an Informationen, die ich im Internet gefunden habe, dass eine Comonad definiert:

  • extract, das ist eine Art Umkehrung von return, dh es wird ein Wert aus einer Comonade herausgenommen .
  • duplicate, das ist eine Art Umkehrung von join, dh es werden zwei Comonaden aus einer einzigen erstellt.

Aber wie kann eine Comonad instanziiert werden, wenn wir sie nur extrahieren oder duplizieren können? Und wie können sie tatsächlich verwendet werden? Ich habe dieses sehr erstaunliche Projekt und das Gespräch darüber (von denen ich leider sehr wenig verstanden habe) gesehen, bin mir aber nicht sicher, von welchem ​​Teil der Funktionalität bereitgestellt wird eine Comonad genau.

Was ist eine Comonad? Wofür sind sie nützlich? Wie können sie verwendet werden? Sind sie essbar?

17
Qqwy

Eine Comonade ist wie eine Monade eine mathematische Struktur in der Kategorietheorie. Das Co-Präfix ist dort sehr verbreitet, um "Umkehrungen" zu bezeichnen, wie Sie es ausdrücken (obwohl ich nicht denke, dass reine Mathematiker der Wahl des Wortes zustimmen).

In der Kategorietheorie gibt es categories, die kurz eine Sammlung von objects (egal welcher Art oder Art, die interne Struktur ist irrelevant) und einige arrows zwischen diesen Objekten platzieren. Damit etwas eine Kategorie ist, müssen die Pfeile einigen Gesetzen folgen (linke/rechte Identität und Assoziativität), aber das ist hier nicht wirklich wichtig.

Die Kategorietheorie ist sowohl sehr abstrakt/schwer zu verstehen als auch sehr umfangreich. Es braucht viel Zeit, um alles durchzugehen (und ich habe es nicht formal studiert, ich kenne nur einige Grundlagen), aber es wird ein Begriff verwendet, der dual genannt wird. Grundsätzlich können Sie für jede Kategorie einen opposite category Erstellen, indem Sie dasselbe tun, aber "alle Pfeile umkehren". Dies ist eine sehr naive Definition, aber es ist schwer zu versuchen, sie zusammenzufassen. Das Dual von etwas in einer Kategorie C ist im Grunde dasselbe in der entgegengesetzten Kategorie C_op (haben Sie schon Kopfschmerzen?)

Wenn Sie eine Monade über eine Kategorie haben (und eine Kategorie kann beispielsweise eine Kategorie sein, in der die Objekte Typen in einer Programmiersprache sind und die Pfeile Funktionen zwischen den Typen sind), dann ist eine Comonade im Grunde dasselbe, nur Sie Ich habe alle Pfeile umgekehrt (ähnlich wie in diesem Fall das Umkehren der Funktionssignaturen).

Eine ausführlichere Beschreibung (wenn auch nicht SUPER hands-on) findet sich in this Diskussion zwischen Erik Meijer und Brian Beckman, wo sie den Begriff der Dualität diskutieren und wie Erik die Umkehrung vornahm Die Pfeile "für IEnumerable<T> in C # beim Erstellen des reaktiven Frameworks und IObservable<T> (was, soweit ich das beurteilen kann und ich bin froh, korrigiert zu werden, im Grunde eine Listen-Comonad-Instanz ist).

Ein weiteres praktisches Beispiel für im Video erwähnte Comonaden ist der Typ Task<T> In .NET, wobei Task<U> ContinueWith<U>(Func<Task<T>, U>) das Dual von bind (oder SelectMany as wäre es heißt in C #)

11
sara

Nach meinem kleinen Verständnis ist eine Comonad eine Rube Goldberg-Maschine , um Post-Docs zu erstellen:

http://www.willamette.edu/~fruehr/haskell/evolution.html

... Entschuldigung, ich konnte nicht widerstehen.

4
dagnelies