在GHCi let y = y + 1
编译很好,但当我试图评估我得到*** Exception: <<loop>>
为什么没有编译错误,这是什么意思<<loop>>
?
Tik*_*vis 25
哈斯克尔let
,where
和顶级绑定默认递归的,即使他们不是一个函数.因此let y = y + 1
定义了一个添加1
到数字的无限循环.GHC代表这样的循环,<<loop>>
除了 - 如果它可以捕获它们,当然!
这可用于延迟操作,因为它允许我们轻松定义诸如无限列表(let xs = 0:xs
)之类的内容,这些内容定义良好且对普通代码实际上很有用.但是,它不能用于像+
(对于大多数数字类型)这样的严格操作,因为它们需要立即评估整个(无限)事物.