是否有可能在Haskell中編寫Y Combinator?Haskell中的Y Combinator
它似乎會有一個無限遞歸類型。
Y :: f -> b -> c
where f :: (f -> b -> c)
什麼的。即使是一個簡單略分解階乘
factMaker _ 0 = 1
factMaker fn n = n * ((fn fn) (n -1)
{- to be called as
(factMaker factMaker) 5
-}
失敗, 「發生時檢查:無法構造無限類型:T = - > T2 - > T1」
(該Y組合看起來像這樣
(define Y
(lambda (X)
((lambda (procedure)
(X (lambda (arg) ((procedure procedure) arg))))
(lambda (procedure)
(X (lambda (arg) ((procedure procedure) arg)))))))
在方案
) 或者,更簡潔的
(λ (f) ((λ (x) (f (λ (a) ((x x) a))))
(λ (x) (f (λ (a) ((x x) a))))))
對於APPLICAT香港專業教育學院爲了 而
(λ (f) ((λ (x) (f (x x)))
(λ (x) (f (x x)))))
這只是一個埃塔收縮離開懶惰的版本。
如果您更喜歡短變量名稱。
+1用於自己回答問題。 – fuz 2010-11-25 05:09:08
正如另一個答案所示,如果你想要一個定點組合器,你可以在不給出類型的情況下寫`yf = f(yf)`並且編譯器將會推斷出'(t - > t) - > t'本身。如維基百科文章所示,這是一個不同的定點組合器,並不嚴格地說是y組合器。 – ShreevatsaR 2011-05-04 15:03:09