Erfahrungsberichte mit indizierten Monaden in der Produktion?

8

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.

    
insitu 06.11.2016, 21:13
quelle

3 Antworten

3

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:

%Vor%

und Prog rams sind nur typenausgerichtete Listen von Op s:

%Vor%

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 :

%Vor%

Also wenden wir diese Maschine nur auf Prog rams an:

%Vor%

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:

%Vor%
  
  • Konnte nicht ableiten: i ~ (Bool : i)     aus dem Kontext: a ~ Bool
  •   
    
Cactus 07.11.2016, 08:41
quelle
3

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.

%Vor%

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.

%Vor%

Unsere Basisaktionen in der Chan Monade senden und empfangen einfach Werte.

%Vor%

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.

%Vor%

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.

    
Benjamin Hodgson 07.11.2016 15:15
quelle
1

Ein weiteres schönes Beispiel sind Mutexe mit Lock-Unlock-Check zur Kompilierzeit. Sie finden dieses Beispiel auf der Website von Stephen Diehl:

Ссылка

    
Shersh 07.11.2016 10:26
quelle