9

我正在使用镜头包,并一直认为必须有一个简单的解决方案来解决以下问题。假设我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

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

4

2 回答 2

4

我在尝试用at.

如果你不需要at这里的插入/删除行为,那么使用ix呢?

x :: Maybe b
x = aMap ^? ix 3 . aLens
于 2013-04-02T21:37:48.587 回答
3

我设法想出了

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

这有点令人困惑,不完全是我想要的,但可以完成工作。

于 2013-04-02T20:03:02.913 回答