來自Haskell,我正在讀伊德里斯關於懶惰(非嚴格性)的故事。我觸輪近期發行說明和found code類似於以下伊德里斯真的「嚴格評估?」
myIf : (b : Bool) -> (t : Lazy a) -> (e : Lazy a) -> a
myIf True t e = t
myIf False t e = e
我寫了一個簡單的階乘函數來測試它
myFact : Int -> Int
myFact n = myIf (n == 1) 1 (n * myFact (n-1))
我跑它和它的工作!
> myFact 5
120 : Int
我決定通過改變myIf
類型簽名破譯它
myIf : (b : Bool) -> a -> a -> a
我重新加載idris
REPL,跑myFact 5
又懷孕了無限遞歸。令我驚訝的是,它仍然以同樣的方式工作!
idris能否確定何時應該避免嚴格?爲什麼這不是永久的遞歸?
我正在使用Idris 0.9.15,並且現在和鏈接的註釋之間沒有任何發行說明,請提及任何更改。
我的REPL做同樣的事情。不過,如果我在REPL中用':x'調用'myFact',或編譯爲可執行文件,我似乎會得到一個無限循環。 –
[Idris eager evaluation]的可能重複(http://stackoverflow.com/questions/23149532/idris-eager-evaluation) – Cactus