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

时间:2014-07-07 22:26:08

标签: javascript functional-programming underscore.js lodash

我想了解如何使用_.compose,例如转过这样的内容:

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

进入作文,有点像:

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

UPD。对不起,可能会问一些非常愚蠢的问题,但我不会想到它的工作方式。为什么:

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

1 个答案:

答案 0 :(得分:4)

没有。功能组成是

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

您需要的是Applicative实际上具有哪些功能

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

幸运的是,exist already的实施,让我们一起去

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

接下来,我们需要一种方法将String.prototype的方法转换为函数,就像它们已经exist in Firefox一样。我们可以将bindbind用于此目的,这也有利于返回(部分)curried函数。

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('?')); }
即使他没有计算机科学学位,每个人都理解: - )