Pochodzę z Haskell, czytałem o historii Idris na temat lenistwa (nie-surowość). I trolled niedawne informacje o wersji i found code podobny do poniższegoCzy Idris naprawdę jest "ściśle oceniany?"
myIf : (b : Bool) -> (t : Lazy a) -> (e : Lazy a) -> a
myIf True t e = t
myIf False t e = e
napisałem prostą funkcję silni, aby go przetestować
myFact : Int -> Int
myFact n = myIf (n == 1) 1 (n * myFact (n-1))
Pobiegłem i to działa!
> myFact 5
120 : Int
postanowiłem podzielić go przez zmianę typu podpis z myIf
do
myIf : (b : Bool) -> a -> a -> a
I Reaktywacja idris
repl i pobiegł myFact 5
ponownie oczekując nieskończonej rekurencji. Ku mojemu zaskoczeniu, wciąż działało tak samo!
Czy idiota może wymyślić, kiedy należy unikać ścisłości? Dlaczego to się nie powtórzyło na zawsze?
Używam Idris 0.9.15 i żadnych uwag do wydania od teraz do połączonych notatek, wspomnij o wszelkich zmianach.
Mój REPL robi to samo. Jednak wydaje mi się, że otrzymam nieskończoną pętlę, jeśli wywołasz 'myFact' z': x' w REPL lub skompiluję do pliku wykonywalnego. –
Możliwy duplikat [Idris eager evaluation] (http://stackoverflow.com/questions/23149532/idris-eager-evaluation) – Cactus