Можно ли написать 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 = 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))))))
Для аппликативного порядка И
(λ (f) ((λ (x) (f (x x)))
(λ (x) (f (x x)))))
Что является лишь сокращением эта для ленивыхверсия.
Если вы предпочитаете короткие имена переменных.