我无法理解 Y-combinator,所以我尝试实现一个在没有本地实现的情况下启用递归的函数。经过一番思考,我最终得出了这个结论:
Y = λx.(λv.(x x) v)
这比实际的短:
Y = λf.(λx.f (x x)) (λx.f (x x))
而且,令我惊讶的是,它奏效了。一些例子:
// JavaScript
Y = function(x){
return function(v){
return x(x, v);
};
};
sum = Y(function(f, n){
return n == 0 ? 0 : n + f(f, n - 1);
});
sum(4);
; Scheme
(define Y (lambda (x) (lambda (v) (x x v))))
(define sum (Y
(lambda (f n)
(if (equal? n 0)
0
(+ n (f f (- n 1)))))))
(sum 4)
两个片段都按预期输出 10(从 0 到 4 的总和)。
这是什么,为什么它更短,为什么我们更喜欢更长的版本?