Можно ли записать Y Combinator в Haskell?
Похоже, у него будет бесконечно рекурсивный тип.
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 combinator выглядит следующим образом
(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)))))
Это просто сокращение эта для ленивой версии.
Если вы предпочитаете короткие имена переменных.