你是如何制作一个Getter的?

时间:2014-10-02 10:56:43

标签: haskell lens

作为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)

1 个答案:

答案 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))