Von Haskell kommend, habe ich über Idris 'Geschichte über Faulheit (Nicht-Strenge) gelesen. Ich habe die letzten Veröffentlichungsnotizen gelesen und Code gefunden , der dem folgenden ähnlich ist
> %Vor%Ich habe eine einfache faktorielle Funktion geschrieben, um es zu testen
%Vor%Ich habe es ausgeführt und es hat funktioniert!
%Vor% Ich habe beschlossen, es zu brechen, indem ich die Typensignatur von myIf
auf
Ich habe das idris
repl geladen und% myFact 5
erneut ausgeführt, um eine unendliche Rekursion zu erwarten. Zu meiner Überraschung funktionierte es immer noch genauso!
Kann Idris herausfinden, wann Strenge vermieden werden sollte? Warum hat das nicht für immer gejagt?
Ich benutze Idris 0.9.15 und keine der Versionshinweise zwischen jetzt und den verknüpften Notizen, erwähne irgendwelche Änderungen.
Die Erklärung ist hier: Ссылка
Die Semantik der Kompilierungszeit und der Laufzeitauswertung ist unterschiedlich (notwendigerweise, da der Typüberprüfer zur Kompilierungszeit Ausdrücke bei Vorhandensein unbekannter Werte auswerten muss), und die REPL verwendet den Begriff der Kompilierzeit, sowohl aus Gründen der Einfachheit als auch Es ist nützlich zu sehen, wie Ausdrücke in der Typüberprüfung reduziert werden.
Aber hier ist noch etwas mehr los. Idris hat entdeckt, dass myIf
eine sehr kleine Funktion ist und hat beschlossen, sie zu inline zu bringen. Also, wenn kompiliert myFact
hat tatsächlich eine Definition, die ein bisschen wie folgt aussieht:
Im Allgemeinen können Sie Kontrollstrukturen wie myIf
schreiben, ohne sich darum sorgen zu müssen, dass die Dinge Lazy
ergeben, denn Idris wird sie trotzdem in die gewünschte Kontrollstruktur zusammenstellen. Gleiches gilt z.B. &&
und ||
und Kurzschlüsse.
Tags und Links idris lazy-evaluation