我在前奏中尝试了以下表达式:
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
为什么表达式是递归的?
答案 0 :(得分:7)
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}}),从而进行循环。