gpt4 book ai didi

javascript - 在参数顺序错误的地方自由点

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:14:22 26 4
gpt4 key购买 nike

我想使用 Ramda 的标准函数集编写一个函数,给定一个字典和一个键,它将增加键的值。示例

fn('foo', {}) // => {foo: 1}
fn('foo', {foo: 1}) // => {foo: 2}

我已经很接近了,但是我缺少一种正确 curry 的方法。

我有一个方法接受一个键和一个对象,然后再返回一个:

// count :: Any -> Number
var count = R.compose(R.inc, R.defaultTo(0))

// countProp :: String -> Object -> Number
var countProp = R.curry(R.compose(count, (R.prop(R.__))))

countProp('foo', {foo:1}) // 2
countProp('foo', {}) // 1

现在我要返回一个新的数据结构

// accum :: String -> Object -> Object
var accum = R.curry(function(key, obj){
return R.assoc(key, countProp(key, obj), obj)
})

accum('foo', {foo: 1}) // => {foo: 2}

但问题是,为了让这一点变得自由,我必须弄清楚如何获取函数设置中的值以正确的顺序进行柯里化(Currying)。我究竟做错了什么?我应该以不同的方式设置此功能吗?我试图设置它,以便两个依赖函数都先获取 key ,然后再获取对象,但我遗漏了一些东西。我应该为此考虑一个特定的 Functor 吗?

谢谢!

最佳答案

几点:

首先,如果@davidchambers 的解决方案满足您的需求,那就太好了。下一个版本的 Ramda 发布时会更好,lensProp添加,这将使这只是

var fooLens = R.lensProp('foo');
fooLens.map(R.inc, {foo: 1, bar: 2}); // => {foo: 2, bar: 2}

其次,您的原始功能与任一镜头版本之间存在差异:

accum('foo', {bar: 1}); //=> {"bar":1,"foo":1}
fooLens.map(R.inc, {bar: 1}); //=> {"bar":1,"foo":null}

第三,无论如何,如果您有兴趣确定如何以无积分的方式包装您的函数,Ramda 有几个函数可以提供帮助。有一个辅助函数 nthArg它只返回一个函数,该函数返回调用它的外部函数的第 n 个参数。然后有几个函数充当 compose 的扩展版本,包括 useWithconverge .

您可以像这样使用它们:

var accum = R.converge(R.assoc, R.nthArg(0), countProp, R.nthArg(1));
accum('foo', {foo: 1, bar: 2}); // => {foo: 2, bar: 2}
accum('foo', {bar: 2}); // => {foo: 1, bar: 2}

在此代码中,converge 将参数(keyobj)传递给作为参数传递的每个函数,除了第一个一个,然后将每个结果传递给第一个函数。


最后,虽然这展示了一种编写无积分代码的方法,而且它最终并不太可怕,但可以说它不如你的早期版本那么清晰,因为它不是无积分的。我喜欢无积分代码。但有时我们会迷恋它,无缘无故地使代码点免费。如果您最终无法使用 lens 版本,您可能需要仔细考虑无积分解决方案是否真的比替代方案更清晰。

关于javascript - 在参数顺序错误的地方自由点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29547786/

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