我有一个非常嵌套的数据结构,我使用Control.Lens.*来简化在一个状态单元中访问它的值。
因此,请考虑以下几点:
data Config = Config { _foo :: Maybe Int
, _bar :: Int
}
$(makeLenses ''Config)我如何操作“功能上的”可能?我想写一篇熟能生巧的文章:
config = Config (Just 1) 0
config^.foo.to fmap (+1) == Just 2更好的是,当Config嵌套得更深时,我们将如何处理这种情况?
data Config = { _foo :: Maybe Foo }
data Foo = Foo { _bar :: Bar }
data Bar = Bar Int
$(makeLenses ''Bar)
$(makeLenses ''Foo)我们可以使用访问器foo和Bar返回修改后的bar吗?
发布于 2013-10-24 02:47:05
您需要使用Prism (可能)进入Just分支。
>>> let config' = config & foo . _Just .~ (+1)
in config' ^. foo
Just 2然后这个Prism将和其他透镜一样组成,形成Traversals。
foo . _Just . bar . _Bar :: Traversal' Config Int看看我写的一些关于透镜的教程,这些教程花了一些时间来研究Lens和Prism之间的关系:
https://www.fpcomplete.com/user/tel/a-little-lens-starter-tutorial
https://www.fpcomplete.com/user/tel/lens-aeson-traversals-prisms
https://stackoverflow.com/questions/19555961
复制相似问题