使用镜头库组成部分吸气剂

时间:2013-04-02 20:00:53

标签: haskell lenses

我正在使用镜头包并且一直认为必须有一个简单的解决方案来解决以下问题。假设我有一些地图(或任何At实例)和价值类型的镜头,即

aMap :: Map Int a
aLens :: Simple Lens a b

我想要一个吸气剂

g :: Getter (Map Int a) (Maybe b)

这是因为我经常想做这样的事情

x :: Maybe b
x = aMap^.at 3.g.aLens

预期语义当然是在Just查找时获得at值,否则为Nothing

当设置一个而不是让traverse取代g时,即

newMap = at 3.traverse.aLens .~ whatever $ aMap

但不是在你得到的时候。是否有一些现成的镜头我刚刚错过的库,或者是否有另一种简单的方法可以在单个表达式中实现这一点?

2 个答案:

答案 0 :(得分:4)

我一直在尝试使用at组合镜头时遇到类似的问题。

如果您不需要此处at的插入/删除行为,那么使用ix呢?

x :: Maybe b
x = aMap ^? ix 3 . aLens

答案 1 :(得分:3)

我设法提出了

x :: Maybe b
x = aMap^.at 3 <&> (^.aLens)

这有点令人困惑,而不是完全我正在寻找的东西,但是完成了工作。