Wird Idris wirklich "streng evaluiert?"

9

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

ändere %Vor%

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.

    
mjgpy3 02.10.2015, 13:52
quelle

1 Antwort

16

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:

%Vor%

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.

    
Edwin Brady 03.10.2015, 12:07
quelle

Tags und Links