gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 17:51:35 24 4
gpt4 key购买 nike

使用 Ramda ,出于教育和风格原因,我正在尝试将相当大的函数转换为无点函数。

该函数有 4 个参数,一个 ES6 ma​​p,一个接受一个对象并返回一个对象的 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)

横向思维

set 怎么样?

您的函数的性质是在 map 上设置一个值——该值被某个函数 domainModel 增加的事实并不意味着它必须是set 函数的一个参数

const set = curry((key, value, map) =>
map.set(key, value)
)

set(someKey, domainModel(json), someMap)
// => Map { ... }

不,如果你的函数不变成嵌套 compose 调用的灾难,你就不能再删除任何点——尤其是因为你正在包装一个方法 (map.set) 这将使保存上下文变得更加复杂。


Ramda 同意这很有用

Ramda 实际上有它自己的 set在 Lens、一些值和一些对象上运行的函数。

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com