Haskell - Combine results from separate lenses
我正在尝试完成以下任务:
1 2 3 4 5
| jsonStr ="{"a": "hello",
"b": ["world", "everyone", "42"]}"
someALens = ...
someBLens = ...
combinedJson = jsonStr ... someALens ... someBLens |
得到结果:
1
| combinedJson == ["hello world","hello everyone","hello 42"] |
然而,我一直在寻找的组合运算符(如 <>~)似乎需要一个设定值来映射(或以其他方式组合)镜头。如何创建可以组合多个镜头的值的复合镜头?
- 我认为 stackoverflow.com/questions/17552835/ 是你要找的。一旦你定义了上面描述的 Monoid 实例,你就可以编写 combinedJson = jsonStr ^.. (someALens <> someBLens)。
-
@haoformayor 那个 monoid 实例包含在最近的 lens 版本中。只需让 ^.. (someALens <> someBLens) 成为答案。
-
这正是我所需要的。谢谢!一旦有人将其作为答案,我将其标记为正确。
正如评论中所讨论的,答案是相当虎头蛇尾的jsonStr ^.. (someALens <> someBLens)。两个吸气剂映射成一个折叠。 Monoids,我们永远的朋友。
- 这怎么虎头蛇尾?我想说它的简单性相当漂亮!
-
同意——这就是我不断回到 Haskell 的原因之一。