我可以使用Sanctuary通过物体进行“过度”

时间:2017-10-09 09:05:36

标签: javascript functional-programming sanctuary

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

我的问题如下: 我如何在Object的嵌套属性中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 个答案:

答案 0 :(得分:1)

在这种情况下,仅存在避难所解决方案,但在一般情况下需要镜头。

这个特殊问题可以用这种方式解决:

> 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进行评论。