Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 哈斯克尔控制。镜头横向棱镜_Haskell_Lenses_Haskell Lens - Fatal编程技术网

Haskell 哈斯克尔控制。镜头横向棱镜

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

我有一个深度嵌套的数据结构,我正在使用Control.Lens.*来简化在状态monad中访问它的值

请考虑以下内容:

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;预览左(左“高”)
。胜利!!!