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

Vic*_*ith 9 haskell lenses

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

aMap :: Map Int a
aLens :: Simple Lens a b
Run Code Online (Sandbox Code Playgroud)

我想要一个吸气剂

g :: Getter (Map Int a) (Maybe b)
Run Code Online (Sandbox Code Playgroud)

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

x :: Maybe b
x = aMap^.at 3.g.aLens
Run Code Online (Sandbox Code Playgroud)

当然,预期的语义是Justat查找时以及Nothing其他方式获取值.

当一个人设置而不是代替traverse工作g,即

newMap = at 3.traverse.aLens .~ whatever $ aMap
Run Code Online (Sandbox Code Playgroud)

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

小智 4

我在尝试用 组合镜头时遇到了类似的问题at

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

x :: Maybe b
x = aMap ^? ix 3 . aLens
Run Code Online (Sandbox Code Playgroud)