我正在使用镜头包,并一直认为必须有一个简单的解决方案来解决以下问题。假设我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
但不是当你得到。是否有一些我刚刚错过的内置镜头库,或者是否有另一种简单的方法可以在单个表达式中实现这一点?