使用Ramda将多参数函数转换为无点样式

时间:2017-03-28 07:55:04

标签: javascript functional-programming ramda.js

使用Ramda,我试图将一个相当大的函数转换为无点,无论是出于教育还是风格上的原因。

该函数有4个参数,一个ES6 map ,一个 domainModel 函数,它接受一个对象并返回一个对象,一个 key 属性确定地图上正在设置的内容,以及 domainModel调用后在地图上设置的 json 属性。

const setNewDomainModelOnMap = curry((map, domainModel, key, json) => map.set(key, domainModel(json)));

现在,我已经考虑了一些功能上的功能,但是如果可能的话,我想使用参数免费版本。我已经成功地在参数较少的函数上实现了无点样式,无法找到接近这个参数的正确角度。

1 个答案:

答案 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