为什么(让x = x + 3 in fst(snd(x + 1,(5,x-2))))等于5

DrE*_*sso -2 haskell

有人可以向我解释为什么这等于5?

let x = x+3 in fst (snd (x+1,(5,x-2)))
Run Code Online (Sandbox Code Playgroud)

bhe*_*ilr 7

让我们暂时忽略这let x = x + 3 in部分,并关注以下内容in:

fst (snd (x + 1, (5, x - 2)))
Run Code Online (Sandbox Code Playgroud)

随着的定义fstsnd福祉

fst (a, b) = a
snd (a, b) = b
Run Code Online (Sandbox Code Playgroud)

所以首先减少括号中的内容

snd (x + 1, (5, x - 2)) ==> (5, x - 2)
Run Code Online (Sandbox Code Playgroud)

现在这传递给fst:

fst (5, x - 2) ==> 5
Run Code Online (Sandbox Code Playgroud)

所以最终价值x实际上并不重要.

这可能发生在Haskell中,因为有些东西叫做懒惰评估.从本质上讲,编译器在需要之前不会解析值.随着定义

x = x + 3
Run Code Online (Sandbox Code Playgroud)

如果你试图打印,x你会得到一个无限循环,当你内存不足试图评估它时,可能会出现错误.由于x从未实际打印出值,编译器可以自由解析其值.在REPL中评估该表达式时打印到控制台的值为5,它与值的依赖性无关x,因此x可以安全地忽略.

另一个懒惰编程的例子就是表达式

> let ones = 1:ones in take 5 ones
[1,1,1,1,1]
Run Code Online (Sandbox Code Playgroud)

该定义let ones = 1:ones定义了1的无限列表,但由于我们只抓取其中的5个take 5 ones,因此该表达式能够解析.