首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Haskell Control.Lens穿越棱镜

Haskell Control.Lens穿越棱镜
EN

Stack Overflow用户
提问于 2013-10-24 02:42:28
回答 1查看 2.4K关注 0票数 4

我有一个非常嵌套的数据结构,我使用Control.Lens.*来简化在一个状态单元中访问它的值。

因此,请考虑以下几点:

代码语言:javascript
复制
data Config = Config { _foo :: Maybe Int
                     , _bar :: Int
                     }

$(makeLenses ''Config)

我如何操作“功能上的”可能?我想写一篇熟能生巧的文章:

代码语言:javascript
复制
config = Config (Just 1) 0
config^.foo.to fmap (+1) == Just 2

更好的是,当Config嵌套得更深时,我们将如何处理这种情况?

代码语言:javascript
复制
data Config = { _foo :: Maybe Foo }
data Foo = Foo { _bar :: Bar }
data Bar = Bar Int
$(makeLenses ''Bar)
$(makeLenses ''Foo)

我们可以使用访问器foo和Bar返回修改后的bar吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-24 02:47:05

您需要使用Prism (可能)进入Just分支。

代码语言:javascript
复制
>>> let config' = config & foo . _Just .~ (+1)
    in  config' ^. foo
Just 2

然后这个Prism将和其他透镜一样组成,形成Traversals。

代码语言:javascript
复制
foo . _Just . bar . _Bar :: Traversal' Config Int

看看我写的一些关于透镜的教程,这些教程花了一些时间来研究LensPrism之间的关系:

https://www.fpcomplete.com/user/tel/a-little-lens-starter-tutorial

https://www.fpcomplete.com/user/tel/lens-aeson-traversals-prisms

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19555961

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档