2015-10-02 26 views
8

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:

+0

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. –

+0

[Idris heves değerlendirme] 'nin olası kopyası (http://stackoverflow.com/questions/23149532/idris-eager-evaluation) – Cactus

cevap

15

açıklaması burada derleme zamanı kavramını kullanarak, hem kolaylık hem de tip denetçisinde ifadelerin nasıl azaldığını görmek yararlıdır. Bununla birlikte, burada biraz daha devam eden bir durum söz konusudur. İdris, myIf'un çok küçük bir işlev olduğunu fark etti ve onu inline etmeye karar verdi. İdris yine istediği denetim yapısının içine derlemek, çünkü Yani genel olarak bir şeyler Lazy yapma kaygısı taşımadan myIf gibi kontrol yapılarını yazabilir

myFact x = case x == 1 of 
       True => 1 
       False => x * myFact (x - 1) 

: myFact derlenmiş Yani aslında biraz benzemekle bir tanımı vardır. Aynı şey, örn. && ve || ve kısa devre.

+0

Bu satır içi optimizasyon, semantik değiştiğinde doğru mu? – luochen1990

+0

Anlambilim değiştirmiyor. Tüm girdiler için aynı cevabı, hangisi yaparsanız yapın. –

+0

Ancak, özellikle kullanıcı benzer bir kodlama stiline geçtiğinde (örneğin kodun satır içi çizilmeye yetecek kadar küçük olmaması gibi), program davranışını değiştirmeyi beklemeden, ancak programların değişmemesini beklerken, anlaşılması zor olan bütünlüğü değiştirir. Artık tekrar çalışmayabilir .. – luochen1990