有人可以向我解释为什么这等于5?
/staging/public_html
答案 0 :(得分:7)
暂时忽略let x = x + 3 in
部分,重点关注in
之后的内容:
fst (snd (x + 1, (5, x - 2)))
fst
和snd
的定义为
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是懒惰的,意味着它仅在需要时评估事物)。