簡體   English   中英

如何評估 `fix f = let {x = fx} in x`?

[英]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'然后PR中的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM