Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/452.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 记忆延续传递样式函数_Javascript_Memoization_Continuation Passing - Fatal编程技术网

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

我想知道是否有一种方法可以实现一个通用的“memoize”函数(比如在一个函数中,一个函数作为输入,一个函数作为输出,作为python的decorator),它也可以处理cps样式的函数

对于普通函数(如“结果值通过返回返回,参数仅用于输入!”),memoize函数可以简单到(在javascript中)

功能记忆(乐趣){
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)});