作为discussed on reddit,您无法将Lens' a b
提升为Lens' (Maybe a) (Maybe b)
。但对于特殊情况Getter a b
,这显然是可能的,因为它与a->b
同构。但与Iso
不同,似乎没有标准功能来执行此提升。
这样做的首选方法是什么?在像
这样的情况下 someFunction $ myMap^.at(i).ꜰᴍᴀᴘGᴇᴛ(mySubGetter)
我当然能做到
someFunction $ myMap^.at(i) & fmap (^.mySubGetter)
但这在其他应用程序中不起作用,就像在状态monad上操作一样。
foo <- use $ myMapInState.at(i).ꜰᴍᴀᴘGᴇᴛ(mySubGetter)
答案 0 :(得分:4)
我相信你可以用棱镜完成你想要的东西。
如果您的值包含以下类型:
myMap :: Map String (Int, String)
myMap = mempty
mySubGetter :: Lens' (Int, String) String
mySubGetter = _2
然后你可以这样做:
myVal :: Maybe String
myVal = myMap ^? at "myKey" . _Just . mySubGetter
如果您只想将函数应用于getter,可以使用Control.Lens.Getter中的to
函数,您必须手动处理子函数:
someFunction $ myMap ^. at(i) . to (fmap (^. mySubGetter))