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

时间:2017-03-02 21:50:07

标签: haskell

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

/staging/public_html

2 个答案:

答案 0 :(得分:7)

暂时忽略let x = x + 3 in部分,重点关注in之后的内容:

fst (snd (x + 1, (5, x - 2)))

fstsnd的定义为

fst (a, b) = a
snd (a, b) = b

首先减少括号中的内容

snd (x + 1, (5, x - 2)) ==> (5, x - 2)

现在这传递给fst

fst (5, x - 2) ==> 5

所以最后x的值实际上并不重要。

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

x = x + 3

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

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

> let ones = 1:ones in take 5 ones
[1,1,1,1,1]

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

答案 1 :(得分:3)

snd(x+1,(5,x-2))等于(5,x-2),然后fst(5,x-2)等于5。所有这些都不需要对包含x的表达式进行任何评估(Haskell是懒惰的,意味着它仅在需要时评估事物)。