【发布时间】:2021-12-24 15:21:05
【问题描述】:
假设我们在数据结构S a 上有一个镜头列表[Lens' (S a) 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
(???) :: *
在哪里找不到运营商(???)。
也许也可以将ls 转换为遍历并简单地使用(%~),我
不知道。
你有什么想法吗?
【问题讨论】:
-
下面有讨论为什么不能将镜头组合成镜头,以及为什么不能将遍历组合成遍历。但我认为镜头也不能组合成遍历。考虑将
(a, b, b)和(a, b)之间的两个明显镜头组合起来:以进行类似于&/%~链的遍历,对第二个(a, b)的更改需要通过以下方式观察a输出第一个变化。这正是Applicative无法做到的那种观察。