gpt4 book ai didi

haskell - 从镜头列表创建遍历

转载 作者:行者123 更新时间:2023-12-04 17:08:45 25 4
gpt4 key购买 nike

假设我们有一个镜头列表 [Lens' (S a) a]关于数据结构 S a .我想以同样的方式修改数据结构中每个镜头的焦点。
我可以这样做:

s :: S a
s = _


ls :: [Lens' (S a) a]
ls = [a, b, c]
a, b, c = _

f :: a -> a
f = _

s' :: S a
s' = s
& a %~ f
& b %~ f
& c %~ f
没关系,但是如果我有 10、100 个镜头呢?我想要一些东西
喜欢
s' :: S a
s' = s & ls ??? f

(???) :: *
我找不到运算符(operator)的地方 (???) .
也许也可以转换 ls进行遍历,只需使用 (%~) , 一世
不知道。
你有想法吗?

最佳答案

第一个问题是you can't actually define the list ls as you've done in your question : 这种类型是非法的。正如那个问题中所讨论的,要将镜头放入容器中,您需要将镜头具体化。完成后,您可以通过应用 (%~ f) 将每个镜头变成一个函数。 ,然后是组合这些函数的简单折叠。
你得到的不是镜头或遍历,而只是S a -> S a类型的函数(与您从 a %~ f 获得的相同)。我找到了 a discussion为什么通常不可能以您提到的您可能希望的方式将多个镜头、 setter 或遍历组合成单个遍历。
这是我上面概述的想法的实现。

data S a = S {_x, _y :: a} deriving Show
makeLenses ''S

ls :: [ReifiedLens' (S (S Int)) Int]
ls = [Lens (x.x), Lens (y.y)]

overEach :: [ReifiedLens' s a] -> (a -> a) -> (s -> s)
overEach ls f s = foldr applySetter s ls
where applySetter (Lens l) acc = acc & l %~ f

s :: S (S Int)
s = S (S 1 2) (S 3 4)

λ> s & overEach succ ls
S {_x = S {_x = 2, _y = 2}, _y = S {_x = 3, _y = 5}}

关于haskell - 从镜头列表创建遍历,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69940168/

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