Haskell 哈斯克尔控制。镜头横向棱镜
我有一个深度嵌套的数据结构,我正在使用Control.Lens.*来简化在状态monad中访问它的值 请考虑以下内容:Haskell 哈斯克尔控制。镜头横向棱镜,haskell,lenses,haskell-lens,Haskell,Lenses,Haskell Lens,我有一个深度嵌套的数据结构,我正在使用Control.Lens.*来简化在状态monad中访问它的值 请考虑以下内容: data Config = Config { _foo :: Maybe Int , _bar :: Int } $(makeLenses ''Config) 我如何在整个过程中“按功能”操作?我想写一个惯用的getter,它可以: config = Config (Just 1) 0 co
data Config = Config { _foo :: Maybe Int
, _bar :: Int
}
$(makeLenses ''Config)
我如何在整个过程中“按功能”操作?我想写一个惯用的getter,它可以:
config = Config (Just 1) 0
config^.foo.to fmap (+1) == Just 2
更好的是,当配置嵌套得更深时,我们将如何处理这种情况
data Config = { _foo :: Maybe Foo }
data Foo = Foo { _bar :: Bar }
data Bar = Bar Int
$(makeLenses ''Bar)
$(makeLenses ''Foo)
我们可以使用访问器foo和bar返回一个修改过的条吗?您需要使用
棱镜来(可能)进入Just
分支
>>> let config' = config & foo . _Just .~ (+1)
in config' ^. foo
Just 2
然后这个Prism
将和其他透镜一样组成,形成transversal
s
foo . _Just . bar . _Bar :: Traversal' Config Int
看看我在lens上写的一些教程,这些教程花了一点时间来研究lens
和Prism
之间的关系:
在这种情况下,您也可以使用映射
或遍历
,而不使用。
。谢谢。我一直试着做“穿越”之类的事情。换句话说,我认为我必须在棱镜上使用一个组合器。我想我已经对这些类型失去了控制。@nomen我在学习镜片的时候也花了很长时间试图做到这一点。在Haskell中,你有一种直觉,可以“在”一个函子下传递函数,但是使用lens的策略是指定“通过”函子的路径。至少我是这么想的。这绝对是另一种风格。文章不错。我发现透镜的介绍非常好,但Prism只列出了一些负面的例子。我已经试了一个多小时了,仍然不知道如何用棱镜写一个可以打字的表达式!棱镜的view\u 1(“goal”,“chaff”)
的等价物是什么?>不管怎样,我最终得到了它:导入控件.Lens;导入控制.Lens.Fold;进口控制.Lens.Prism;预览左(左“高”)
。胜利!!!