Ist es möglich, die Y Combinator in Haskell zu schreiben?Y Combinator in Haskell
Es scheint, als ob es einen unendlich rekursiven Typ hätte.
Y :: f -> b -> c
where f :: (f -> b -> c)
oder so etwas. Auch leicht eine einfache einkalkuliert faktorielles
factMaker _ 0 = 1
factMaker fn n = n * ((fn fn) (n -1)
{- to be called as
(factMaker factMaker) 5
-}
nicht mit "Check Tritt: die unendliche Typ nicht konstruieren kann: t = t -> t 2 -> t1"
(Die Y Combinator sieht wie folgt aus
(define Y
(lambda (X)
((lambda (procedure)
(X (lambda (arg) ((procedure procedure) arg))))
(lambda (procedure)
(X (lambda (arg) ((procedure procedure) arg)))))))
im Schema) Oder kurz und bündig mehr als
(λ (f) ((λ (x) (f (λ (a) ((x x) a))))
(λ (x) (f (λ (a) ((x x) a))))))
Für die applicat ive Ordnung Und
(λ (f) ((λ (x) (f (x x)))
(λ (x) (f (x x)))))
die nur eine eta Kontraktion weg für die Faulen Version.
Wenn Sie kurze Variablennamen bevorzugen.
+1 für die Beantwortung der Frage allein. – fuz
Wie die andere Antwort zeigt, können Sie, wenn Sie einen Festkomma-Kombinator haben wollen, einfach 'yf = f (yf)' schreiben, ohne einen Typ anzugeben, und der Compiler wird den Typ '(t -> t) -> t' ableiten selbst. Dies ist ein anderer Fixpunktkombinator und nicht streng genommen der y-Kombinator, wie der Wikipedia-Artikel zeigt. – ShreevatsaR