【问题标题】:Haskell - Combine results from separate lensesHaskell - 合并来自不同镜头的结果
【发布时间】:2016-04-09 14:55:29
【问题描述】:

我正在尝试完成以下任务:

jsonStr = "{\"a\": \"hello\", 
            \"b\": [\"world\", \"everyone\", \"42\"]}"
someALens = ...
someBLens = ...
combinedJson = jsonStr ... someALens ... someBLens

得到结果:

combinedJson == ["hello world", "hello everyone", "hello 42"]

但是,我一直在寻找的组合运算符(如<>~)似乎需要一个设定值来映射(或以其他方式组合)镜头。如何创建可以组合多个镜头的值的复合镜头?

【问题讨论】:

  • 我认为stackoverflow.com/questions/17552835/… 是您正在寻找的。一旦你定义了上面描述的 Monoid 实例,你就可以写combinedJson = jsonStr ^.. (someALens <> someBLens)
  • @haoformayor 在最近的lens 版本中包含这个monoid实例。只需让^.. (someALens <> someBLens) 成为答案。
  • 这正是我所需要的。谢谢!一旦有人将其作为答案,我将其标记为正确。

标签: json haskell haskell-lens aeson


【解决方案1】:

正如 cmets 中所讨论的,答案是相当虎头蛇尾的jsonStr ^.. (someALens <> someBLens)。两个吸气剂映射成一个折叠。 Monoids,我们永远的朋友。

【讨论】:

  • 这怎么虎头蛇尾?我想说它的简单性相当漂亮!
  • 同意 - 这是我不断回到 Haskell 的原因之一。
猜你喜欢
  • 2012-03-15
  • 1970-01-01
  • 2010-12-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-24
  • 2022-01-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多