我可以通过带有 Sanctuary 的对象 属性 制作 "over"

Can I make "over" via object propery with Sanctuary

Ramda 是我的第一个函数式编程库,现在我将 Sanctuary 与 Ramda 进行比较。也许我的一些问题太愚蠢了,但我没有找到最好的学习避难所的方法。

我的问题如下: 如何在对象的嵌套 属性 中 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]}

避难所有任务收费吗?

在这种情况下,存在仅 Sanctuary 解决方案,但在一般情况下需要透镜。

这个特殊问题可以这样解决:

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

这取决于 {numbers: [1, 2, 3, 4, 5]}StrMap (Array Number) 的成员。由于字符串映射是仿函数,我们可以映射字符串映射来访问数组,然后映射数组来访问数字。

如果对象具有其他不同类型的字段,则它不会是字符串映射。 {active: true, numbers: [1, 2, 3, 4, 5]}的类型是{ active :: Boolean, numbers :: Array Number },一种记录类型。记录类型不支持映射,所以我们需要像 R.overR.lensProp 这样的东西来对 numbers 字段的值应用转换。 Sanctuary 尚未提供任何使用镜头的功能。如果您有兴趣看到这些函数被添加到库中,请考虑在 sanctuary-js/sanctuary#177 上发表评论。