2017-03-02 78 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,這種表達是能解決。