我正在使用镜头包,并一直认为必须有一个简单的解决方案来解决以下问题.假设我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)
当然,预期的语义是Just
在at
查找时以及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)