是否可能在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)))))))
在scheme中)
或者更简洁地说
(λ (f) ((λ (x) (f (λ (a) ((x x) a))))
(λ (x) (f (λ (a) ((x x) a))))))
对于应用次序(Applicative Order)
(λ (f) ((λ (x) (f (x x)))
(λ (x) (f (x x)))))
对于懒惰的版本,这只是eta压缩的一步之遥。
如果你喜欢使用短变量名。