¿Es posible escribir el Y Combinator en Haskell?Y Combinator en Haskell
Parece que tendría un tipo infinitamente recursivo.
Y :: f -> b -> c
where f :: (f -> b -> c)
o algo así. Incluso un simple ligeramente factorizar factorial
factMaker _ 0 = 1
factMaker fn n = n * ((fn fn) (n -1)
{- to be called as
(factMaker factMaker) 5
-}
falla con "Ocurre cheque: no se puede construir el tipo infinita: t = t -> t2 -> t1"
(El combinador Y se parece a esto
(define Y
(lambda (X)
((lambda (procedure)
(X (lambda (arg) ((procedure procedure) arg))))
(lambda (procedure)
(X (lambda (arg) ((procedure procedure) arg)))))))
en el esquema) O, más sucintamente como
(λ (f) ((λ (x) (f (λ (a) ((x x) a))))
(λ (x) (f (λ (a) ((x x) a))))))
Para el applicat Para ive Y
(λ (f) ((λ (x) (f (x x)))
(λ (x) (f (x x)))))
que se encuentra a la contracción eta distancia para la versión perezoso.
Si prefiere nombres cortos de variables.
+1 por responder la pregunta usted mismo. – fuz
Como muestra la otra respuesta, si quieres un combinador de punto fijo puedes escribir 'yf = f (yf)' sin dar un tipo y el compilador inferirá el tipo '(t -> t) -> t' sí mismo. Este es un combinador de punto fijo diferente y no estrictamente el combinador y, como muestra el artículo de Wikipedia. – ShreevatsaR