原型函数在函数组合中的应用

Applying prototype function in function composition

本文关键字:函数 应用 组合 原型      更新时间:2023-09-26

我想了解如何使用_.compose,例如像这样转动:

url.substr(url.indexOf('?')) 

的组合,比如:

var c = _.compose(String.substr, String.indexOf('?'))
c(url)

乌利希期刊指南。很抱歉问了这么愚蠢的问题,但我不明白它应该是怎么工作的。原因:

c = _.compose('abcd'.indexOf)
c('c')  // returns 5.. wtf?

No。函数组成

  substr(indexOf(url))
= compose(substr, indexOf)(url)

你需要的实际上是一个应用程序,它具有

  substr(url, indexOf(url)) // actually substr(url)(indexOf(url))
= ap(substr, indexOf)(url)

幸运的是,它的实现已经存在,让我们使用

function ap(f, g) {
    return function() {
        return f.apply(this, arguments)(g.apply(this, arguments));
    };
}

接下来,我们需要一种方法将String.prototype的方法转换为函数,就像Firefox中已经存在的那样。我们可以使用bind来实现这个目的,它也有返回(部分)柯里化函数的好处。

var substr = Function.prototype.bind.bind(String.prototype.substr);
var indexOf = Function.prototype.bind.bind(String.prototype.indexOf);

你现在会像使用indexOf("abcd")("c")substr("abcd")(2)一样使用它们。最后但并非最不重要的是,我们需要翻转indexOf的参数,以便我们可以像使用flippedIndexOf("c")("abcd")一样使用它(更重要的是,单独获得flippedIndexOf("c")函数)。所以我们用

function flip(f) {
    return function(b) {
        return function(a) {
            return f(a)(b);
        };
    };
}

现在,我们可以做你最初想做的了:

var c = ap(substr, flip(indexOf)("?"));

看起来不错,而且实际工作!


但也许这并不值得所有的困惑。直接用

function c(url) { return url.substr(url.indexOf('?')); }

即使没有计算机学位,每个人都能看懂:-)