Javascript 记忆延续传递样式函数
我想知道是否有一种方法可以实现一个通用的“memoize”函数(比如在一个函数中,一个函数作为输入,一个函数作为输出,作为python的decorator),它也可以处理cps样式的函数 对于普通函数(如“结果值通过返回返回,参数仅用于输入!”),memoize函数可以简单到(在javascript中)Javascript 记忆延续传递样式函数,javascript,memoization,continuation-passing,Javascript,Memoization,Continuation Passing,我想知道是否有一种方法可以实现一个通用的“memoize”函数(比如在一个函数中,一个函数作为输入,一个函数作为输出,作为python的decorator),它也可以处理cps样式的函数 对于普通函数(如“结果值通过返回返回,参数仅用于输入!”),memoize函数可以简单到(在javascript中) 功能记忆(乐趣){ var cache={}; 返回函数(){ var args=Array.prototype.slice.call(参数); if(缓存中的参数) 返回缓存[args]; v
功能记忆(乐趣){
var cache={};
返回函数(){
var args=Array.prototype.slice.call(参数);
if(缓存中的参数)
返回缓存[args];
var ret=fun.apply(这是参数);
缓存[args]=ret;
返回ret;
};
}
但是我的简单的memoize
函数无法记忆cps样式的函数,因为我需要“再次”计算类型函数的参数,同时还要知道要传递给它们的参数
例如,给定函数
function cps(param, next) {
var ret = param + 1;
// setTimeout for simulate async behaviour
setTimeout(function () {
next(ret);
}, 0);
}
也许我可以发现next
是一个函数,但它的签名(嗯……也许吧,但它很复杂),而且肯定不是函数中使用的参数
有人能告诉我我错了吗D
我对能够记忆六个cps风格的函数很感兴趣,我不想在每一个函数中插入一个“缓存”的逻辑混乱。我是cps新手,但我认为您必须以特定的方式构造函数 您的CPS函数具有以下结构(根据您的示例进行概括): 因此,您可以使用标准的记忆器,并构造CPS函数。因此,首先CPS生成器(假定函数的最后一个参数始终是要传递给的函数)将此参数分开: 然后回忆录可以与它一起使用:
function plusOne(val) {
return val+1;
}
var memoPlusOne = memoize(plusOne);
var cpsMemPlusOne = cpsMaker(memoPlusOne);
cpsMemPlusOne(3,function(n){console.log(n)});
重点是将转换的记忆化与CPS构造分开
感谢您介绍记忆化CPS的理念;即使这个答案是垃圾,也让我大开眼界 如果您传递一个哈希表作为函数的参数(定义n对键:值),它将简化逻辑以达到您的目的?它不是那么简单:我使用的是cps样式的函数,因为我处理的是ajax调用:continueIfTrue/continueIfFalse不是由我的函数直接调用的,注册为回调,并在响应返回时由浏览器调用。。。我看不出使用哈希表对我有什么帮助(也许我只是个盲人:D照亮我!)。
function cpsMaker(transformFunc) {
return function() {
var args = Array.prototype.slice.call(arguments);
var next = args.pop(); // assume final arg is function to call
var ret = transformFunc.apply(this,args);
// setTimeout for simulate async behaviour
setTimeout(function () {
next(ret);
}, 0);
}
}
function plusOne(val) {
return val+1;
}
var memoPlusOne = memoize(plusOne);
var cpsMemPlusOne = cpsMaker(memoPlusOne);
cpsMemPlusOne(3,function(n){console.log(n)});