Setter 镜头作用于 haskell 中的一系列列表

Setter lens to act on a range of a list in haskell

给定一个数组,例如 [1..] 有没有办法用透镜将 [4,100] 范围内的所有数字加倍,所以它变成

1,2,3,8,10,12,14,16,...,200,101,102...

我不太熟悉镜头,但我觉得 getter 是解决这个问题的正确工具。

> :m + Control.Lens Data.Ix
> (traverse . filtered (inRange (4, 7)) *~ 2) [1..10]
[1,2,3,8,10,12,14,8,9,10]

请注意,这可能违反了镜头法则,因此在较大的代码上下文中可能会出现意外行为——应该注意传递给 filtered 的 属性 没有被违反通过执行的更新!