使用Ramda,我试图将一个相当大的函数转换为无点,无论是出于教育还是风格上的原因。
该函数有4个参数,一个ES6 map ,一个 domainModel 函数,它接受一个对象并返回一个对象,一个 key 属性确定地图上正在设置的内容,以及 domainModel调用后在地图上设置的 json 属性。
const setNewDomainModelOnMap = curry((map, domainModel, key, json) => map.set(key, domainModel(json)));
现在,我已经考虑了一些功能上的功能,但是如果可能的话,我想使用参数免费版本。我已经成功地在参数较少的函数上实现了无点样式,无法找到接近这个参数的正确角度。
答案 0 :(得分:4)
专业功能
整个讨论的重点是它允许你使用绑定的每个参数来专门化函数。这允许我们编写泛型函数,这些函数可以以各种方式专门用于
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)
横向思维
仅set
怎么样?
你的函数的性质是在地图上设置一个值 - 这个值是由某个函数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