Was ist der Unterschied zwischen Moggis rechnergestützter Metasprache und Moggis Lambda-Kalkül?

8

Dies ist eine Referenzverwirrung. Manchmal sehe ich Leute, die den Begriff "Moggis rechnergestützte Metasprache" verwenden, um sich auf den von Moggi vorgestellten Kalkül zu beziehen, und manchmal auf "Moggis rechnergestütztes Lambda-Kalkül". Manchmal verwenden sie und manchmal .λmlλc

Ich habe immer angenommen, dass beide dasselbe sind, aber wenn ich die Zusammenfassung eines Vortrags von Katsumata und Moegelberg lese, heißt es :

Wir zeigen die Fülle von Moggis monadischer Übersetzung vom rechnerischen Lambda-Kalkül mit Summen zur rechnergestützten Metasprache mit Summen unter Verwendung des TT- und TT-Closure-Operators.\lc\lml

Sind diese Sprachen nicht dasselbe? Wo werden sie speziell mit diesen Namen eingeführt? Es scheint, als würde Moggi manchmal über das Modell für eine sogenannte Metasprache , aber in einem anderen spricht er über die rechnergestützte Lambda-Berechnung.λc

Töpfer
quelle

Antworten:

1

Die Terminologie kann etwas verwirrend sein, aber es gibt zwei Sprachen, zum Beispiel in Moggis "Vorstellungen von Berechnungen als Monaden" (kostenloser Link hier: https://core.ac.uk/download/pdf/21173011.pdf ).

In diesem Artikel werden die Sprachen als λml , die Metasprache, und λpl als "Programmiersprache" bezeichnet. Ich glaube, λpl spielt die Rolle des rechnerischen Lambda-Kalküls, aber ich kann mich irren. Ein verwirrender Aspekt ist, dass beide Sprachen einen expliziten Typkonstruktor T der die Monade darstellt, aber unterschiedlich verwendet werden.

λml ist eine "reine" Sprache mit einer MonadeT , dh jede Manipulation der Monade ist in den Typen explizit und der Funktionstypτ1τ2 ist der Typ der reinen Funktionen. Beachten Sie die Bindungsregel (aus Abbildung 3 auf Seite 9):

x:τmle1:Tτ1x1:τ1mle2:Tτ2x:τmlletTx1e1ine2:Tτ2

e1 unde2 werden explizit als Terme vonTτ1,Tτ2 typisiert , um zu markieren, dass sie wirksam sind. Jeder wirksame Ausdruck ist wirklich ein reiner Begriff mit monadischem Typ. Dies ähnelt der Art und Weise, wie wir mit Monaden in Haskell programmieren, wobei Haskell die Rolle der Metasprache spielt und die Monade Effekte codiert, aber tatsächlich manipulieren wir immer "reine" Begriffe (ich setze "rein" in Anführungszeichen, da Haskell seine eigenen Divergenzeffekte hat und Fehler).

Wir können dies in der Semantik der Metasprache sehen: Ein Term x:τmle:τ bezeichnet einen Morphismus [τ][τ] , die Monade entsteht nur, wenn wir ihn erwähnen.

Andererseits soll λpl eine effektive Call-by-Value-Programmiersprache sein. Als solcher Term ist x:τple:τ ein möglicherweise wirksamer Term, der Werte vom Typ τ zurückgibt , ähnlich wie Sprachen wie SML und OCaml. Deshalb wird in der Arbeit der Funktionstyp ττ geschrieben , weil es sich um die Art der effektiven Funktionen handelt, nicht um reine Funktionen.

Vergleichen Sie hier die Bindungsregel (aus Abbildung 5 auf Seite 11):

x:τple1:τ1x1:τ1ple2:τ2x:τplletx1e1ine2:τ2

e2x:τple:τ[τ]T[τ]

λpl enthält einen expliziten MonadenkonstruktorT , den SML und OCaml nicht als Konstruktor vom primitiven Typ haben, weilTa äquivalent zuunit -> aweil->bedeutet effektive Funktion bedeutet.

Max Neu
quelle