[英]How to use Y- Combinator; why does this infinite recursion return 9?
我一直在努力學習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.