2017-03-02 80 views

回答

3

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

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秒的无限名单,但由于我们只有抓住他们的5 take 5 ones,这种表达是能解决。