2017-10-09 4 views
1

Ramdaは私の最初の関数型プログラミングライブラリで、今ではSanctuaryとRamdaを比較します。たぶん私の質問はあまりにも愚かですが、私はSanctuaryを学ぶ最良の方法を見つけませんでした。Sanctuaryでオブジェクトのプロパティを介して "オーバー"することができます

私の質問は次のとおりです。 mapオブジェクトのネストされたプロパティで配列を作成するにはどうすればよいですか?そのため

RAMDAコード:

const addOneForNumbers = R.over(R.lensProp('numbers'), R.map(R.add(1))) 

addOneForNumbers({ numbers: [1, 2, 3, 4, 5] }) 
// {"numbers": [2, 3, 4, 5, 6]} 

はサンクチュアリは、タスクのための通行料を持っていますか?

答えて

1

この場合、聖域のみの解決策が存在しますが、一般的なケースではレンズが必要になります。

この特定の問題は、この方法で解決することができます

> S.map(S.map(S.add(1)), {numbers: [1, 2, 3, 4, 5]}) 
{numbers: [2, 3, 4, 5, 6]} 

これはStrMap (Array Number)のメンバーである{numbers: [1, 2, 3, 4, 5]}に依存しています。文字列マップはファンクタなので、文字列マップにマップして配列にアクセスし、配列にマップして番号にアクセスすることができます。

オブジェクトに異なるタイプの他のフィールドがある場合は、文字列マップではありません。 {active: true, numbers: [1, 2, 3, 4, 5]}のタイプは{ active :: Boolean, numbers :: Array Number }で、レコードタイプです。レコードタイプはマッピングをサポートしていないので、numbersフィールドの値に変換を適用するには、R.overR.lensPropのようなものが必要です。 Sanctuaryはまだレンズを扱うための機能を提供していません。ライブラリに追加されたこれらの関数の表示に興味がある場合は、sanctuary-js/sanctuary#177のコメントを検討してください。

関連する問題