![](/img/trans.png)
[英]Advantages of using curried functions over a normal function in javascript
[英]Map a curried function over an array using lenses
我有一个对象,想使用其他对象成员更新对象内部数组中的每个值。 这是我正在尝试的内容:
import * as R from 'ramda'
const obj = {
array: [ 1, 2, 3 ],
incrementBy: 0
};
const doIncrement = R.curry((inc,val) => {
return val+inc;
});
const incrementLens = R.lensProp('incrementBy');
const setIncrementToOne = R.set(incrementLens,1);
const newObj = setIncrementToOne(obj);
const arrayLens = R.lensProp('array');
const incrementA = R.over(arrayLens, R.map(doIncrement(1)));
const incrementB = R.pipe(
setIncrementToOne,
R.chain(
R.over(arrayLens, R.map(doIncrement)),
R.view(incrementLens)
)
)
console.log(JSON.stringify(incrementA(newObj))); // works: {"array":[2,3,4],"incrementBy":1}
console.log(JSON.stringify(incrementB(obj))); // does not work (TypeError: Cannot read property 'fantasy-land/map' of undefined)
当我直接访问数组并将我的柯里化函数映射到它时,版本 A 显然有效。 然而,在版本 B 中,我不确定事情的顺序; 我现在尝试过的似乎没有将值从R.view
适当地传递给R.view
函数。
(注意,用例更复杂,我只想了解如何同时使用柯里化函数、地图和镜头。)
当R.chain
被施加到功能- chain(f, g)(x)
相当于f(g(x))(x)
-赋予功能g
上值的'x',返回,然后应用功能f
上g(x)
结果,然后是值x
。
在你的情况下:
g(x)
( R.view(incrementLens)
) 是 1f
( R.over(arrayLens, R.map(doIncrement))
) 是一个等待值的函数(不是另一个函数) 在g(x)
) 上应用f
( R.over...
) 将透镜应用于非对象值,即使它是一个对象,结果也会是另一个值,这意味着您没有函数应用于管道中setIncrementToOne
的结果。
的结果g(x)
在这种情况下需要是一个功能,即可以通过使用R.over
与arraylens
-获得R.over(arrayLens, R.map(R.add(1)))
这与incrementA
相同。
注意:我已经用doIncrement
替换了R.add
,它做同样的事情。
const obj = { array: [1, 2, 3], incrementBy: 0 }; const incrementLens = R.lensProp('incrementBy'); const setIncrementToOne = R.set(incrementLens, 1); const newObj = setIncrementToOne(obj); const arrayLens = R.lensProp('array'); const incrementB = R.pipe( setIncrementToOne, R.chain( R.over(arrayLens), R.pipe(R.view(incrementLens), R.add, R.map) ) ) const incrementA = R.over(arrayLens, R.map(R.add(1))); console.log(JSON.stringify(incrementA(newObj))); // works: {"array":[2,3,4],"incrementBy":1} console.log(JSON.stringify(incrementB(obj))); // works: {"array":[2,3,4],"incrementBy":1}
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.26.1/ramda.js"></script>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.