gpt4 book ai didi

javascript - 如何将 JavaScript 中的以下函数转换为连续传递样式 (CPS)?

转载 作者:行者123 更新时间:2023-11-29 18:11:02 25 4
gpt4 key购买 nike

假设我有以下功能:

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

function g(x) { return x * 2; }

function h() { return 5; }

如何将表达式 f(g(h())) 转换为连续传递样式?我知道 h 被转换为:

function h(ret) { ret(5); }

但是,我不知道如何将表达式 f(g(h())) 转换为 CPS。

此外,如果 f 接受 2 个参数而不是 1 个参数怎么办?这在 CPS 中看起来如何?

此外,如果 fg 根本不接受任何参数怎么办?这在 CPS 中看起来如何?

最佳答案

Continuation 传递样式非常简单。例如,假设您有以下要转换为 CPS 的函数:

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

function g(x) {
return x * 2;
}

function h() {
return 3;
}

alert(f(g(h())));

用 CPS 编写:

function f(k) {
return function (x) {
return k(x + 1);
};
}

function g(k) {
return function (x) {
return k(x * 2);
};
}

function h(k) {
return k(3);
}

h(g(f(alert)));

f 接受两个参数时:

function f(k) {
return function (x) {
return function (y) {
return k(x + y);
};
};
}

function g(k) {
return function (x) {
return k(x * 2);
};
}

function h(k) {
return k(3);
}

h(h(g(f(alert))));

如果 fg 不接受任何参数,它们就不是函数(在函数的数学意义上)。因此,它们只是常量:

function f(k) {
return k(1);
}

function g(k) {
return k(2);
}

function h(k) {
return k(3);
}

h(alert);
g(alert);
f(alert);

无法使用 CPS 组合常量。想一想:当 fg 不带任何参数时,f(g(h())) 没有任何意义争论。最好只写 h(), g(), f()

Continuation passing 风格在与 currying 结合使用时特别好:

var f = curry(function (k, x, y) {
return k(x + y);
});

var g = curry(function (k, x) {
return k(x * 2);
});

function h(k) {
return k(3);
}

h(h(g(f(alert))));

function curry(f, l, a) {
var len = l;
var args = a;

switch (arguments.length) {
case 1: len = f.length;
case 2: args = [];
}

if (args.length + 1 === len) {
return function (a) {
return f.apply(null, args.concat([a]));
};
} else {
return function (a) {
return curry(f, len, args.concat([a]));
};
}
}

希望对您有所帮助。

关于javascript - 如何将 JavaScript 中的以下函数转换为连续传递样式 (CPS)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27436335/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com