【问题标题】:Currying Javascript function with custom order of fixed parameters使用固定参数的自定义顺序柯里化 Javascript 函数
【发布时间】:2013-01-15 20:27:26
【问题描述】:

柯里化函数很有用:

function tag(name, value) {  
    return '<' + name + '>' + value + '</' + name + '>';
}

var strong = tag.bind(undefined, "strong");
strong("text"); // <strong>text</strong>

现在假设我们必须使用另一个参数顺序错误的函数

function otherTag(value, name) {  
    return '<' + name + '>' + value + '</' + name + '>';
}

如何使用 bind 函数获得相同的结果 - 使用 otherTag 函数创建强标签。

如何仅使用 bind 对这个函数进行柯里化?


我对基于像这样包装 otherTag 函数的解决方案不感兴趣:

wrapOtherTag(name, value) {
    return otherTag(value, name);
}

我想知道是否可以将参数传递给 bind 以告诉我们要柯里化的参数的顺序。

【问题讨论】:

  • 不。参数按您传递它们的顺序绑定。您必须实施自己的解决方案。
  • @opengrid。如果您详细说明这可能有用的情况,您可能会更感兴趣。
  • @opengrid。附:您确定 currying 是您所要求的正确术语吗?
  • 我不明白这一点。你想颠倒参数的顺序,但你想 bind 神奇地知道你希望它们的顺序是什么?为什么不使用对象:{name:name, value:value} 在这种情况下?
  • Functional.js 库有一个函数可以让您执行此操作,尽管它主要用作学术示例。

标签: javascript ecmascript-5 partial-application


【解决方案1】:

编写一个函数来反转参数顺序:

function swap(fn) {
    return function(a, b) {
        return fn(b, a); 
    };
}

现在打电话

swap(otherTag).bind(0, "strong");

【讨论】:

    【解决方案2】:

    您可以编写自己的函数来完成此操作。

    // Uncurry `this` in `slice`.
    var slice = Function.prototype.call.bind(Array.prototype.slice);
    
    function curry(fn, arg, index) {
        return function curried(/* ...args */) {
            var args = slice(arguments);
            args.splice(index, 0, arg);
            return fn.apply(this, args);
        };
    }
    
    var strong = curry(tag, "strong", 0);
    strong("text"); // <strong>text</strong>
    
    var otherStrong = curry(otherTag, "strong", 1);
    otherStrong("text"); // <strong>text</strong>
    

    【讨论】:

      猜你喜欢
      • 2022-08-14
      • 2018-04-18
      • 2018-02-05
      • 1970-01-01
      • 1970-01-01
      • 2016-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-14
      相关资源
      最近更新 更多