首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >memoize continuation传递样式函数

memoize continuation传递样式函数
EN

Stack Overflow用户
提问于 2012-04-05 18:38:42
回答 1查看 672关注 0票数 5

我想知道是否有一种方法可以实现一个通用的"memoize“函数(比如在一个函数中,一个函数作为输入,一个函数作为输出,就像python的装饰器一样),能够处理cps风格的函数。

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

代码语言:javascript
复制
function memoize(fun) {
    var cache = {};
    return function () {
        var args = Array.prototype.slice.call(arguments);
        if (args in cache)
            return cache[args];
        var ret = fun.apply(this, arguments);
        cache[args] = ret;
        return ret;
    };
}

但是cps样式的函数不能被我的简单memoize函数记住,因为我需要“再次”计算类型函数的参数,同时也知道要传递给它们的参数。

例如,给定函数

代码语言:javascript
复制
function cps(param, next) {
    var ret = param + 1;

    // setTimeout for simulate async behaviour
    setTimeout(function () {
            next(ret);
    }, 0);
}

也许我可以发现next是一个函数,但它的签名(好吧...也许吧,但这很棘手),而且绝对不是函数中使用的参数!

有人能告诉我我错了吗?

我对能够记住半打cps风格的函数很感兴趣,我不想在每个函数中都插入一个“缓存”。

EN

回答 1

Stack Overflow用户

发布于 2012-04-15 04:36:43

我是CPS的新手,但我认为你必须以一种特殊的方式构造你的函数。

您的CPS函数具有以下结构(根据您的示例进行概括):

代码语言:javascript
复制
function cps(param, next) {
    var ret = someFunctionOfParam(param);

    // setTimeout for simulate async behaviour
    setTimeout(function () {
        next(ret);
    }, 0);
}

因此,您可以使用标准的memoizer,并构造CPS函数。为了保持这一点,首先使用CPS-maker (假定函数的最后一个参数始终是要传递的函数):

代码语言:javascript
复制
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);
           }
}

然后记忆器就可以和它一起使用了:

代码语言:javascript
复制
function plusOne(val) {
    return val+1;
}

var memoPlusOne = memoize(plusOne);
var cpsMemPlusOne = cpsMaker(memoPlusOne);

cpsMemPlusOne(3,function(n){console.log(n)});

重点是将转换的记忆与CPS结构分开。

感谢您介绍memoized的想法;即使这个答案是垃圾,它也让我大开眼界!

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10027032

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档