Functional programming 嵌套函数组合

Functional programming 嵌套函数组合,functional-programming,lambda-calculus,Functional Programming,Lambda Calculus,我无法理解以下函数组合: function plus_one(x) { return x + 1; } function trans(f) { return function(x) { return 2 * f(2 * x); }; } function twice(f) { return function(x) { return f(f(x)); } } 当我试图计算((两次)(trans))(加上一次)(1) 这就

我无法理解以下函数组合:

function plus_one(x) {
    return x + 1;
}

function trans(f) {
    return function(x) {
        return 2 * f(2 * x);
    };
}

function twice(f) {
    return function(x) {
        return f(f(x));
    }
}
当我试图计算
((两次)(trans))(加上一次)(1)
这就是我得到的,假设
加1
是f

f(2f(2x))=2f(2*2f(2x))=2f(4f(2x))=2*(4*(2+1))=24。
但将其输入到“勇敢者”中会发现它是20

非常感谢您的帮助

非常感谢advanced.

((两次)(trans))(加一)
trans(trans(加一))
,并且

trans(trans(plus_one)) (1)
—> trans(λx.2 * plus_one(2*x)) (1)
—> λy.2 * ((λx.2 * plus_one(2*x))(2*y) (1)
—> 2 * (λx.2 * plus_one(2*x)) (2*1)
-> 2 * 2 * plus_one(2*2)
-> 2 * 2 * 5
-> 20
((两次)(trans))(加一)
trans(trans(加一))
,并且

trans(trans(plus_one)) (1)
—> trans(λx.2 * plus_one(2*x)) (1)
—> λy.2 * ((λx.2 * plus_one(2*x))(2*y) (1)
—> 2 * (λx.2 * plus_one(2*x)) (2*1)
-> 2 * 2 * plus_one(2*2)
-> 2 * 2 * 5
-> 20

在不同的函数中使用不同的参数名可能有助于避免混淆它们
f
并不总是指
加上一个

我们可以评估

twice(trans)(plus_one)(1)
作为


在不同的函数中使用不同的参数名可能有助于避免混淆它们
f
并不总是指
加上一个

我们可以评估

twice(trans)(plus_one)(1)
作为


为什么使用
lambda演算
标记?为什么使用
lambda演算
标记?