为什么我会得到一个异常循环

时间:2017-06-08 06:29:59

标签: haskell

我在前奏中尝试了以下表达式:

nblist_0 = {1,2,3,4}
nblist_1 = {3,7,5,9,1}
nblist_2 = {7,4,9,2,5}
nblist_3 = {1,2,4,6}
nblist_4 = {1,5,4}
... 

我有以下异常

let x = x in x

为什么表达式是递归的?

1 个答案:

答案 0 :(得分:7)

Haskell中的

let绑定是(相互)递归的,这意味着您可以在任何定义中引用任何已定义的变量/函数(=符号左侧的内容)( =标志右侧的内容。对于你有参数(函数)的情况,这几乎总是直观的预期行为。

let fact n = if n == 0 then 1 else n * fact (n - 1) in fact 5

在上文中,fact (n - 1)的定义中fact n可能会使用x,您可能并不感到惊讶。在您的示例中,您在自己的定义中使用let x = x in x

当Haskell尝试评估x时,它会不断尝试扩展x(进入RHS {{1}}),从而进行循环。