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

标签 javascript functional-programming ramda.js

使用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)

横向思维

只需设置怎么样?

函数的本质是在 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/

相关文章:

javascript - JavaScript 的 FilterWithKeys?

haskell - Objective-C 的跨平台函数式语言

javascript - ramda源码中@@functional/placeholder是什么意思?

javascript - 如何摆脱 chart.js 圆环图中较大的左右边距?

javascript - 在 Sharepoint 2010 webpart 中解析 json

function - 在 Scala 中,为什么我们在定义方法时需要 "="?

scala - 仿函数有什么用处?

javascript - Flowtype Javascript 推理未按预期工作

javascript - Uncaught ReferenceError ,通知未定义

javascript - 在 ASP 内容页面上使用 javascript 悬停