Ich lese funktionale Sprachen implementieren: ein Tutorial , und stieß auf ein Problem, wenn Floating-Pass von vollständig faulem Lambda-Hub implementiert wurde.
Ich möchte beschreiben, wie das Floating funktioniert, um diese Frage klar zu machen, wenn Sie damit vertraut sind, springen Sie einfach zur nächsten Frage .
Das Konzept wird auf Seite 246 in der Arbeit vorgestellt und hauptsächlich auf Seite 256-257 implementiert.
Im Falle von let(rec)
Ausdruck heißt es:
Wir müssen floated Definitionen der rechten Seite vor den
let(rec)
Ausdruck selbst setzen, da die rechte Seite von ihnen abhängen kann.
zum Beispiel:
%Vor% Die Variable $mfe
ist ein maximaler freier Ausdruck (MFE) , die durch vorherigen Durchlauf identifiziert wurde, wenn wir mit let f
Ausdruck arbeiten, floaten wir f
out als eine Gruppe und hängen sie an [(1, [($mfe, a * a)])]
, die von der rechten Seite von let f
erhalten wurde. Hier zeigt die erste Komponente 1
die freie Ebene der Gruppe an.
Beim Zurückverfolgen zu \a -> f
Abstraktion haben wir festgestellt, dass sowohl $mfe
als auch f
damit verbunden sind. Daher sollten wir sie hier installieren:
Angenommen, wir haben ein Programm wie dieses:
%Vor% Die freie Stufe von b x
und a y
ist 2, da y
Stufe 2 hat und sich in derselben Gruppe befindet.
Während freies Level von cons p (b x)
und cons q (a y)
3 ist, werden b x
und a y
als MFEs markiert (Habe ich hier Fehler gemacht?).
Unter Verwendung des von SPJ gegebenen Algorithmus wird das Programm in folgendes umgewandelt:
%Vor% Ich denke, die MFEs auf der rechten Seite von let(rec)
expression sollten nicht den let(rec)
-Bereich verlassen, wenn immer auf die linke Seite verwiesen wird, und das korrekte Ergebnis könnte so aussehen :
Ist das Papier falsch? oder ich habe es einfach missverstanden.
Tags und Links haskell functional-programming lambda-calculus program-transformation