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 的原因之一。
来源:https://www.codenong.com/36518458/