簡體   English   中英

使用鏡頭在陣列上映射柯里化函數

[英]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',返回,然后應用功能fg(x)結果,然后是值x

在你的情況下:

  • g(x) ( R.view(incrementLens) ) 是 1
  • f ( R.over(arrayLens, R.map(doIncrement)) ) 是一個等待值的函數(不是另一個函數)

g(x) ) 上應用f ( R.over... ) 將透鏡應用於非對象值,即使它是一個對象,結果也會是另一個值,這意味着您沒有函數應用於管道中setIncrementToOne的結果。

的結果g(x)在這種情況下需要是一個功能,即可以通過使用R.overarraylens -獲得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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM