作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
假设我有以下功能:
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 中看起来如何?
此外,如果 f
和 g
根本不接受任何参数怎么办?这在 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))));
如果 f
和 g
不接受任何参数,它们就不是函数(在函数的数学意义上)。因此,它们只是常量:
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 组合常量。想一想:当 f
和 g
不带任何参数时,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/
我是一名优秀的程序员,十分优秀!