【发布时间】:2016-08-19 13:56:48
【问题描述】:
lodash 流函数是真正的 compose 函数,还是看起来像一个,但经过优化以快速运行并牺牲了我期望的灵活性?我希望 flow 能够返回一个我可以 curry 的函数,但它却返回了一个使用 Javascript 的 arguments 关键字的函数。所以 curry 无法判断有待处理的参数,它会立即被调用。
足够直观地工作:
var add = function(x, y) {
return x + y
};
var exclam = function(x) {
return x.toString() + "!";
}
exclam(1) // "1!"
add(1,2) // 3
var add1 = FP.curry(add)(1);
add1(4) // 5
var add1AndExclam = FP.flow([add1, exclam])
add1AndExclam(2) // "3!"
非直观结果:
addAndExclam = FP.flow([add, exclam])
/*
function(){
var t=arguments,e=t[0];
if(i&&1==t.length&&yi(e)&&e.length>=200)return i.plant(e).value();
for(var u=0,t=r?n[u].apply(this,t):e;++u<r;)t=n[u].call(this,t);
return t
}
*/
addAndExclam(1,2) // "3!"
add1AndExclamV2 = FP.curry(addAndExclam)(1) // "NaN!"`
寻找另一个库来帮助函数式编程范式是不是有点矫枉过正?我应该自己做曲子吗?我使用了 lodash,因为它已经在我的项目中了。文档使它看起来像 flow 应该是 lodash 的 compose。
我还发现很难在 lodash 的 each 中使用 data 参数(我想要一个类似 eachMyArrayName 快捷方式的东西)。无论我使用 curryRight 还是 lodash 对象占位符约定。
lodash FP 是否只是为了让 lodash 函数可以自动 curriable?还是我做错了什么,它可以用作主要的函数式编程助手?
编辑:
如果我愿意,我可以像这样包装函数,但它似乎违背了元编程的目的,让代码看起来像样板。
add1AndExclamV2 = FP.curry(function(x, y) {
return addAndExclam(x, y)
})(1)
add1AndExclamV2(2)
“3!”`
【问题讨论】:
-
Curry 无法判断参数的数量,因为 javascript 中没有静态类型系统,每个函数都是可变参数。函数的
.length属性只是一个提示,在compose函数中为可变参数、非curried函数设置它是一个麻烦。 Ramda 经历了这个(但很少失败),而 Underscore/Lodash 没有。如果您事先curry您的函数,compose将按预期工作。
标签: javascript functional-programming lodash currying