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 aufruft main
. Es gibt unsafePerformIO
natürlich auch. Wenn Sie sich die Maybe
Monade als eine "Maschine am Ende des Förderbands" vorstellen möchten, können Sie sie verwenden maybe
.
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.