【发布时间】:2011-05-15 11:26:54
【问题描述】:
是否可以在 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 收缩。
如果您更喜欢短变量名。
【问题讨论】:
标签: haskell y-combinator