为什么让y = 1 + y编译,这是什么意思?

Ale*_*ler 17 haskell

在GHCi let y = y + 1编译很好,但当我试图评估我得到*** Exception: <<loop>>

为什么没有编译错误,这是什么意思<<loop>>

Tik*_*vis 25

哈斯克尔let,where和顶级绑定默认递归的,即使他们不是一个函数.因此let y = y + 1定义了一个添加1到数字的无限循环.GHC代表这样的循环,<<loop>>除了 - 如果它可以捕获它们,当然!

这可用于延迟操作,因为它允许我们轻松定义诸如无限列表(let xs = 0:xs)之类的内容,这些内容定义良好且对普通代码实际上很有用.但是,它不能用于像+(对于大多数数字类型)这样的严格操作,因为它们需要立即评估整个(无限)事物.

  • @TikhonJelvis,在GHC中,一个"黑洞"是一个非常具体的东西:它是一个被标记为已被输入的thunk,但尚未完全评估.在单线程RTS中,尝试进入黑洞是产生"<<< loop >>>"异常的原因.没有其他类型的无限循环这样做.在多线程RTS中,黑洞变成"灰洞".试图评估灰洞的线程等待(可能永远)某个其他线程完成评估它. (5认同)
  • 比较:`int get_value_of_y(){return get_value_of_y()+ 1; 在命令式语言中 (4认同)