![](/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.