【发布时间】:2019-08-10 03:31:45
【问题描述】:
R.evolve 让我们用应用于该属性当前值的函数的结果替换对象属性:
R.evolve({ count: R.inc }, { count: 1 })
== { count: 2 }
但我经常发现我想添加一个从输入对象的多个属性计算的属性:
assocFruitTotal({ appleCount: 5, orangeCount: 3 })
== { appleCount: 5, orangeCount: 3, fruitCount: 8 }
我想出了自己的简单实用函数:
const assocDerived = R.curry(
(name, f, obj) => ({
...obj,
[name]: f(obj)
});
...我经常使用它:
const sumFruit = R.pipe(
R.props(['appleCount', 'orangeCount']),
R.sum);
const assocFruitTotal = assocDerived('fruitCount', sumFruit);
但是我使用它的频率让我想知道为什么它不是 Ramda 原生,就像许多其他方便的功能一样。这使得 我想知道我是否错过了一个更好的实现结果的习惯用法 - 即通过添加基于其他属性组合的属性来构建对象中的细节。
我应该使用惯用的函数式编程结构吗?
【问题讨论】:
-
更通用的函数式成语是comonads,用于解包值及其上下文。
-
提出这个建议的 PR 会受到 Ramda 团队的欢迎。扩展
evolve或添加这样的新函数可能是有意义的。不能保证它会被接受,但它会得到公平的听证。 -
applySpec与o[prop] = f(o)完全相同,请记住返回的f可能需要强制为unary。
标签: functional-programming ramda.js