[英]How `fix f = let {x = f x} in x` is evaluated?
fix f = let {x = fx} in x
談到let
,我認為let P = Q in R
將評估 Q -> Q' 然后 P 被 R 中的 Q' 替換,或者: R[P -> Q']
。
但是在fix
定義中Q取決於R,那么如何評估呢?
我想這是關於惰性評估的。 Q'變成了一個重擊,但我無法在我的腦海中推理。
作為上下文,我正在查看Y組合器,它應該找到 function 的固定點,所以如果我有這個 function, one x = 1
,然后fix one == 1
必須保持,對吧?
所以fix one = let {x = one x} in x
,但我看不出1
會如何出現。
談到 let,我認為
P = Q in R
將評估Q -> Q'
然后P
被R
中的Q'
替換,或者:R[P -> Q']
。
從道德上講,是的,但是P
不會立即評估,而是在需要時進行評估。
但是在修復定義中
Q
取決於R
,那么如何評估呢?
Q
不依賴於R
,它依賴於P
。 這使得P
遞歸地依賴於自身。 這可能導致幾種不同的結果。 粗略地說:
如果Q
在評估P
之前不能返回其結果的任何部分,則P
表示無限遞歸計算,它不會終止。 例如,
let x = x + 1 in x -- loops forever with no result -- (GHC is able to catch this specific case and raise an exception instead, -- but it's an irrelevant detail)
如果Q
可以在需要評估P
之前返回其結果的一部分,它會這樣做。
let x = 2: x in x -- x = 2: .... can be generated immediately -- This results in the infinite list 2:2:2:2:2:..... let x = (32, 10 + fst x) in x -- x = (32, ...) can be generated immediately -- hence x = (32, 10 + fst (32, ...)) = (32, 10+32) = (32, 42)
我想這是關於惰性評估的。
Q'
變成了一個重擊,但我無法在我的腦海中推理。
P
與 thunk 相關聯。 重要的是這個 thunk 在返回 output 的某些部分之前是否調用自身。
作為上下文,我正在查看 Y 組合器,它應該找到 function 的固定點,所以如果我有這個 function。
one x = 1
,然后fix one == 1
必須保持,對嗎?
是的。
所以
fix one = let x = one x in x
,但我不明白為什么1
會從中出現
我們可以這樣計算:
fix one
= {- definition of fix -}
let x = one x in x
= {- definition of x -}
let x = one x in one x
= {- definition of one -}
let x = one x in 1
= {- x is now irrelevant -}
1
只需擴展定義。 保留遞歸定義,以防您再次需要它們。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.