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:τ1⊢mle2:Tτ2x:τ⊢mlletTx1⇐e1ine2: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:τ1⊢ple2:τ2x:τ⊢plletx1⇐e1ine2:τ2
e2x:τ⊢ple:τ′[τ]→T[τ′]
λpl enthält einen expliziten MonadenkonstruktorT , den SML und OCaml nicht als Konstruktor vom primitiven Typ haben, weilTa
äquivalent zuunit -> a
weil->
bedeutet effektive Funktion bedeutet.