是否可以在 Haskell中编写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)))))
对于惰性版本来说,这只是一个 eta 收缩。
如果您更喜欢短变量名。