【发布时间】:2019-05-05 22:32:11
【问题描述】:
lodash 新手并尝试使用它以获得更多理解。我不明白以下代码的行为。
了解_.curry 的arity 参数后,我有一个代码sn-p,它产生的结果对我来说似乎很奇怪。
const words = ['jim', 'john'];
const pad10 = words =>
_.map(words, word => _.pad(word, 10));
console.log(pad10(words)); // [ ' jim ', ' john ' ]
const flipMap = _.flip(_.map);
const flipPad = _.flip(_.pad);
const curriedFlipMap = _.curry(flipMap, 2);
const pad10v2 = curriedFlipMap(word => flipPad(' ', 10, word));
console.log(pad10v2(words)); // [ ' jim ', ' john ' ]
const curriedFlipPad = _.curry(flipPad, 3);
const padWord10 = curriedFlipPad(' ', 10);
const pad10v3 = curriedFlipMap(word => padWord10(word));
console.log(pad10v3(words)); // [ ' jim ', ' john ' ]
const pad10v4 = curriedFlipMap(padWord10);
console.log(pad10v4(words)); // [ 'jim,john', 'jim,john' ]
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>
我不明白最后一个 console.log 的输出。在我看来,当需要一个 arg 函数时,我只是将 a => f(a) 替换为 f。
【问题讨论】:
-
这称为eta转换。它假定柯里化函数。因此,将
arr.map(f)与arr.map(a => f(a))进行比较。你能说出区别吗?查看Array.prototype.map能够处理什么样的函数。这是 Javascript 中两种形式的唯一区别。 -
我知道什么是eta转换。那不是我的问题。这就是我试图用来简化代码的方法。然而,在这种情况下,它给出了一个令人惊讶的(错误的)结果。请注意,如果您将 'flipPad' 的声明更改为
const flipPad = (padding, length, text) => _.pad(text, length, padding);(IOW - 只需自己进行翻转),则上述代码将按预期工作。这让我相信使用“_.flip”会发生一些我不知道的事情。 -
我相信 JavaScript 中的箭头函数语法将函数的
this隐式绑定到调用站点,而传递函数则不会(完整的function(...) { ... }语法也不需要显式 @987654330 @ 称呼)。我不知道这是否适用于这种情况。 -
您说您知道什么是 eta 转换,但您的问题标题仍然是
When is a => f(a) not equivalent to f?。我告诉过你什么时候不等价:在 Javascript 的多参数函数的上下文中。顺便说一句,jim,john之类的字符串通常是在Array<String>值的隐式toString转换时构造的。 -
@bbarrington 如果您使用 lodash 进行函数式编程,请查看
lodash/fp
标签: javascript functional-programming lodash currying