簡體   English   中英

如何使用Y-Combinator; 為什么這個無限遞歸返回9?

[英]How to use Y- Combinator; why does this infinite recursion return 9?

Y - Combinator

我一直在努力學習Y - Combinators 對它的解釋也很可愛)並且從這個wiki中得到了一個例子。 無論是Haskell還是Python,都會對這個主題進行深入的解釋。 Pleaaase!

fix :: (a -> a) -> a
fix f = f (fix f)

問題

fix應用於(\\x -> 9)時,名為fix的函數返回9並且我不知道為什么; 當我跟隨堆棧時,我想象f(f ... (fix f) ...)

>> fix (\x -> 9)
>> 9

首先:你所擁有的fix功能是一個用直接遞歸實現的定點組合器。 Y組合器是一個特殊的定點組合器, 它不需要語法遞歸,因此它以不同的方式實現了與fix相同的功能。

如果你很好奇,你可以在SO上看看如何在Haskell中實現Y組合器 靜態類型有點棘手 - 它需要一個遞歸類型才能工作。

至於你的第二個問題,代碼的工作原因是懶惰。 如果你將(\\ x -> 9)應用於任何東西 ,那么這件事永遠不會得到評估。 嘗試這個:

λ> (\ x -> 9) (error "fail")
9

這包括fix定義中的遞歸調用。 看看在fix定義中用(\\ x -> 9)替換最外層f時會發生什么:

(\ x -> 9) (fix f)

遵循與具有error的版本完全相同的邏輯,遞歸調用永遠不會被評估 ,您只需獲得9

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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