使用Ramda ,出于教育和风格方面的原因,我正在尝试将相当大的函数转换为无点函数。
该函数有 4 个参数,一个 ES6 map,一个接受一个对象并返回一个对象的 domainModel 函数,一个 key 属性识别在 map 上设置的内容,以及由 domainModel 调用后在 map 上设置的 json 属性。
const setNewDomainModelOnMap = curry((map, domainModel, key, json) => map.set(key, domainModel(json)));
现在,我已经柯里化(Currying)了该函数以获得一些功能优点,但如果可能的话,我想使用无参数版本。我已经成功地在参数较少的函数上采用了无点风格,但无法完全找出接近这一点的正确 Angular 。
最佳答案
专门化功能
柯里化(Currying)的全部意义在于,它允许您使用绑定(bind)的每个参数来专门化函数。这使我们能够编写可以以多种方式专门化的通用函数
const mult = x => y => x * y
const double = mult (2)
const triple = mult (3)
const negate = mult (-1)
console.log(double(5)) // 10
console.log(triple(5)) // 15
console.log(negate(5)) // -5
您有一个名为 setNewDomainModelOnMap
的函数,它有一个非常专业的名称,但函数本身非常具体 - 它没有任何通用性。
如果您编写了一个通用函数,该函数可以根据您提供的参数进行专门化,该怎么办?
// maybe something liek this would be better
const myfunc = set (someKey, someValue)
const updatedMap = myFunc (oldMap)
横向思维
只需设置
怎么样?
函数的本质是在 map 上设置一个值 - 该值由某个函数 domainModel
增强的事实并不意味着它必须是您设置的函数的参数
const set = curry((key, value, map) =>
map.set(key, value)
)
set(someKey, domainModel(json), someMap)
// => Map { ... }
不,如果你的函数不会变成嵌套 compose
调用的灾难,你就无法再删除任何点 - 特别是因为你正在包装一个方法 (map.set
) >) 这将使保存上下文变得更加复杂。
Ramda 同意这很有用
Ramda 实际上有自己的 set对镜头、某些值和某些对象进行操作的函数。
var xLens = R.lensProp('x');
R.set(xLens, 4, {x: 1, y: 2}); //=> {x: 4, y: 2}
R.set(xLens, 8, {x: 1, y: 2}); //=> {x: 8, y: 2}
鉴于此,如果您担心命名冲突,您可能需要将函数命名为 mapSet
关于javascript - 使用 Ramda 将多参数函数转换为无点样式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43063746/