我想了解如何使用_.compose
,例如转过这样的内容:
url.substr(url.indexOf('?'))
进入作文,有点像:
var c = _.compose(String.substr, String.indexOf('?'))
c(url)
UPD。对不起,可能会问一些非常愚蠢的问题,但我不会想到它的工作方式。为什么:
c = _.compose('abcd'.indexOf)
c('c') // returns 5.. wtf?
答案 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('?')); }
即使他没有计算机科学学位,每个人都理解: - )