gpt4 book ai didi

haskell - 如何使用 Control.Lens 更新列表的第 i 个元素?

转载 作者:行者123 更新时间:2023-12-03 23:20:56 25 4
gpt4 key购买 nike

我有一些数据类型

data Outer = Outer { _list :: [ Inner ] }
data Inner = Inner { _bool :: Bool }

使用 Control.Lens,我可以像这样访问第 i 个内部(在“状态外部”单子(monad)内)的 _bool
boolValue <- gets (^. list . to (!! i) . inner)

我也希望能够用类似的东西更新这个值
list ^. (to (!! i)) ^. inner %= True

但是(根据我的理解),“to”函数只创建一个 getter,而不是一个可以用作 getter 或 setter 的真正镜头。

那么,如何将 (!! i) 转换为允许我更新此字段的镜头?

最佳答案

你不能*转(!!)除了 Getter 之外的任何类似镜头的东西-- 但是有一个函数可以做这种事情:ix ,用于访问索引处的事物。它实际上是一个 Traversal ,而不是 Lens -- 在这里,这只是意味着它可能会失败(如果索引超出范围) -- 但只要索引在列表中,它就会工作。

不过还有另一个问题——(^.)也是一个专门用于获取值的运算符。它与例如不兼容。 (%=) ,它以一个类似镜头的东西作为它的第一个参数。和:(%=)用于将函数映射到现有值;如果只想设置,可以使用(.=) .所以你可能想要这样的东西:

list . ix i . inner .= True

* 实际上有一个函数可以做到这一点——它叫做 upon - 但它使用了奇妙的邪恶黑魔法,你不应该使用它,至少不应该用于这个(并且可能不用于任何真正的代码)。

关于haskell - 如何使用 Control.Lens 更新列表的第 i 个元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17006679/

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