【发布时间】:2015-12-30 18:10:07
【问题描述】:
来自 Haskell,我正在阅读 Idris 关于懒惰(非严格)的故事。我查看了最近的发行说明,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或编译为可执行文件,我似乎会陷入无限循环。
标签: lazy-evaluation idris