我正在使用镜头包并且一直认为必须有一个简单的解决方案来解决以下问题。假设我有一些地图(或任何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
但不是在你得到的时候。是否有一些现成的镜头我刚刚错过的库,或者是否有另一种简单的方法可以在单个表达式中实现这一点?
答案 0 :(得分:4)
我一直在尝试使用at
组合镜头时遇到类似的问题。
如果您不需要此处at
的插入/删除行为,那么使用ix
呢?
x :: Maybe b
x = aMap ^? ix 3 . aLens
答案 1 :(得分:3)
我设法提出了
x :: Maybe b
x = aMap^.at 3 <&> (^.aLens)
这有点令人困惑,而不是完全我正在寻找的东西,但是完成了工作。