gpt4 book ai didi

haskell - 如何fmap一个Getter?

转载 作者:行者123 更新时间:2023-12-03 07:08:46 25 4
gpt4 key购买 nike

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)

最佳答案

我相信你可以用棱镜完成你想要的事情。

如果您的值具有以下类型:

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

关于haskell - 如何fmap一个Getter?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26159369/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com