Haskell'den geliyorum, tembellik hakkında tembellik (katı olmayanlık) hakkında bir şeyler okuyordum. Ben son sürüm notlarını trolled ve aşağıdakiİdris gerçekten "kesinlikle değerlendirildi mi?"
myIf : (b : Bool) -> (t : Lazy a) -> (e : Lazy a) -> a
myIf True t e = t
myIf False t e = e
benzeyen found code ben o
myFact : Int -> Int
myFact n = myIf (n == 1) 1 (n * myFact (n-1))
test etmek için basit faktöriyel fonksiyon yazdım ben koştum ve işe yaradı!
> myFact 5
120 : Int
ben
idris
Repl yeniden
myIf : (b : Bool) -> a -> a -> a
için myIf
tipi imzasını değiştirerek kırmaya karar verdi ve tekrar sonsuz özyinelemeye bekliyor myFact 5
koştu. Benim için sürpriz hala aynı şekilde çalıştı!
Sertlikten kaçınılması gerektiğinde idris karar verebilir mi? Neden bu sonsuza kadar nüks etmedi?
Şu andaki ve bağlanan notaların arasındaki hiçbir nottan bahsetme, Idris 0.9.15 kullanıyorum ve sürüm notlarının hiçbiri kullanmıyorum. (En tip denetleyicisi bilinmeyen değerlerin varlığında ifadeleri değerlendirmek gerekiyor derleme süresi beri, bu nedenle zorunlu olarak) zaman derlemek ve zaman değerlendirme semantik farklıdır çalıştırmak http://docs.idris-lang.org/en/latest/faq/faq.html#evaluation-at-the-repl-doesn-t-behave-as-i-expect-what-s-going-on
ve REPL geçerli:
REPL'm aynı şeyi yapıyor. Ancak, REF içinde ': x' ile myFact'ı çağırırsam veya bir yürütülebilir dosyayı derlersek, sonsuz bir döngü elde ettim. –
[Idris heves değerlendirme] 'nin olası kopyası (http://stackoverflow.com/questions/23149532/idris-eager-evaluation) – Cactus