Est-il possible d'écrire le Y Combinator en Haskell ?
Il semble qu'il aurait un type infiniment récursif.
Y :: f -> b -> c
where f :: (f -> b -> c)
ou quelque chose comme ça. Même une simple factorielle légèrement factorisée
factMaker _ 0 = 1
factMaker fn n = n * ((fn fn) (n -1)
{- to be called as
(factMaker factMaker) 5
-}
échoue avec "Occurs check : cannot construct the infinite type : t = t -> t2 -> t1" (vérification de l'existence d'un type infini)
(Le Y combinator ressemble à ceci
(define Y
(lambda (X)
((lambda (procedure)
(X (lambda (arg) ((procedure procedure) arg))))
(lambda (procedure)
(X (lambda (arg) ((procedure procedure) arg)))))))
dans le schéma) Ou, plus succinctement, comme
(λ (f) ((λ (x) (f (λ (a) ((x x) a))))
(λ (x) (f (λ (a) ((x x) a))))))
Pour l'ordre applicatif Et
(λ (f) ((λ (x) (f (x x)))
(λ (x) (f (x x)))))
Ce qui est juste une contraction de eta pour la version paresseuse.
Si vous préférez des noms de variables courts.