In einer früheren Frage habe ich die Existenz von Conor McBrides Kleisli-Pfeilen von Outrageous Fortune während der Suche nach Möglichkeiten der Codierung Idris Beispiele in Haskell . Meine Bemühungen, McBrides Code zu verstehen und ihn in Haskell kompilieren zu lassen, führten zu diesem Kern: Ссылка
Bei der Suche nach Hackage habe ich mehrere Implementierungen dieser Konzepte entdeckt, insbesondere durch (rate wer?) Edward Kmett und Gabriel Gonzalez .
Welche Erfahrung haben Menschen, um einen solchen Code in Produktion zu bringen? Insbesondere, treten die erwarteten Vorteile (Laufzeitsicherheit, selbststeuernde Nutzung) tatsächlich IRL auf? Wie wäre es mit dieser Art von Code im Laufe der Zeit und onboarding Newcomer?
BEARBEITEN : Ich habe den Titel geändert, um deutlicher zu machen, wonach ich suche: Real-world-Verwendung von indizierten Monaden in freier Wildbahn. Ich bin daran interessiert, sie zu verwenden, und ich habe mehrere Anwendungsfälle im Hinterkopf, nur frage mich, ob andere Leute sie bereits in "Produktion" Code verwendet haben.
EDIT 2 : Dank der großartigen Antworten, die bisher geliefert wurden, und nützlichen Kommentaren habe ich den Titel und die Beschreibung dieser Frage erneut bearbeitet, um genauer zu reflektieren, welche Art von Antwort ich erwarte, z. Erfahrungsbericht.
Ich denke, das Folgende sollte als ein praktisches Beispiel gelten: Statisch "Well-Stackedness" in einem Compiler durchsetzen. Kesselplatte zuerst:
%Vor%Dann eine einfache Stapelsprache:
%Vor% und wir werden uns nicht mit echtem Label
s beschäftigen:
und Prog
rams sind nur typenausgerichtete Listen von Op
s:
Also können wir in dieser Einstellung sehr leicht einen Compiler machen, der eine indizierte Schreiber-Monade ist; das heißt, eine indizierte Monade:
%Vor%ermöglicht das Akkumulieren eines (n indizierten) Monodens:
%Vor% wie normal Writer
:
Also wenden wir diese Maschine nur auf Prog
rams an:
und dann können wir versuchen, eine einfache Ausdruckssprache zu kompilieren:
%Vor% und wenn wir z.B. Eines der Argumente für BINOP
, der Typchecker erkennt dies:
- Konnte nicht ableiten:
i ~ (Bool : i)
aus dem Kontext:a ~ Bool
Sitzungstypen versuchen, den Netzwerkprotokollen Typenbeschreibungen zu geben. Die Idee ist, dass, wenn ein Client einen Wert sendet, der Server bereit sein muss, um es zu empfangen, und umgekehrt.
Hier ist ein Typ (mit TypeInType
), der Sitzungen beschreibt, die aus einer Folge von zu sendenden Werten und zu empfangenden Werten bestehen.
a :! s
bedeutet "sende einen Wert vom Typ a
, dann fahre mit dem Protokoll s
fort". a :? s
bedeutet "empfange einen Wert vom Typ a
und fahre mit dem Protokoll s
fort".
So Session
repräsentiert eine (type-level) Liste von Aktionen. Unsere monadischen Berechnungen werden sich entlang dieser Liste bewegen und Daten senden und empfangen, wie es der Typ erfordert. Konkret reduziert eine Berechnung des Typs Chan s t a
die verbleibende Arbeit, die zu erledigen ist, um das Protokoll von s
bis t
zu erfüllen. Ich werde Chan
mithilfe der indizierten freien Monade erstellen, die ich in meiner Antwort auf Ihre andere Frage verwendet habe.
Unsere Basisaktionen in der Chan
Monade senden und empfangen einfach Werte.
send
nimmt den aktuellen Status der Sitzung von a :! s
nach s
und erfüllt die Verpflichtung, eine a
zu senden. Entsprechend transformiert recv
eine Sitzung von a :? s
in s
.
Hier ist der spaßige Teil. Wenn ein Ende des Protokolls einen Wert sendet, muss das andere Ende bereit sein, es zu empfangen, und umgekehrt. Dies führt zu der Idee eines Dual des Sitzungstyps:
%Vor% In einer Gesamtsprache wäre Dual (Dual s) = s
beweisbar, aber leider ist Haskell nicht total.
Sie können ein Paar von Kanälen verbinden, wenn ihre Typen dual sind. (Ich nehme an, Sie würden dies eine In-Memory-Simulation der Verbindung eines Clients und eines Servers nennen.)
%Vor% Hier ist zum Beispiel ein Protokoll für einen Server, der testet, ob eine Zahl größer als 3 ist. Der Server wartet auf ein Int
, sendet ein Bool
zurück und beendet dann die Berechnung.
Und um es zu testen:
%Vor%Sitzungstypen sind ein Bereich der aktiven Forschung. Diese spezielle Implementierung ist für sehr einfache Protokolle geeignet, aber Sie können keine Protokolle beschreiben, bei denen der Typ der Daten, die über die Leitung gesendet werden, vom Zustand des Protokolls abhängt. Dafür braucht man Überraschungsüberraschung, abhängige Typen. Sehen Sie diesen Vortrag von Brady für eine kurze Demonstration des Stands der Technik der Sitzungstypen.
Tags und Links haskell types monads type-level-computation