我在前奏中尝试了以下表达式:
let x = x in x
Run Code Online (Sandbox Code Playgroud)
我有以下例外
Exception: <<loop>>
Run Code Online (Sandbox Code Playgroud)
为什么表达式是递归的?
letHaskell中的绑定是(相互)递归的,这意味着您可以=在任何定义(=符号右侧的内容)中引用任何已定义的变量/函数(符号左侧的内容).对于你有参数(函数)的情况,这几乎总是直观的预期行为.
let fact n = if n == 0 then 1 else n * fact (n - 1) in fact 5
Run Code Online (Sandbox Code Playgroud)
在上面,你可能并不惊讶,fact (n - 1)可用于定义fact n.在您的示例中,您使用的x是自己的定义.
当Haskell试图评估时let x = x in x,它会不断尝试扩展x(进入RHS x),因此循环.