2

假设我有一个这样的数组:[1, 2, 3, 4]

如何使用 lens 包只修改偶数值?我正在寻找类似的东西:

filterLens even (+10) $ [1, 2, 3, 4]
=> [1, 12, 3, 14]
4

2 回答 2

7
Prelude Control.Lens> [1, 2, 3, 4] & each . filtered even %~ (+ 10)
[1, 12, 3, 14]

要查找此类功能,您可以通过在搜索字段中输入“+lens”来指示hoogle 搜索镜头包。在这种情况下:http ://www.haskell.org/hoogle/?hoogle=%2Blens+filter

于 2014-06-07T01:29:26.990 回答
1

好吧,如果我们看一下我们想要的类型

evens :: Lens' [a] [a]

只要我们不考虑焦点列表的长度,它似乎应该是一个有效的镜头。因此,使用 getter 和定值对构建起来相对容易。

evens = lens get set where
  get (a:b:xs) = b : get xs
  get _ = []

  set [] xs = xs
  set xs [] = xs
  set (x:xs) (y:ys) = x:y:set xs ys

但是,如果我们密切关注 set 函数,我们会发现实现完整的 filterLens 存在困难:我们滥用了我们知道镜头目标的确切结构这一事实。通用 filterLens 需要能够重建顺序以仅使用它的一部分来重建总类型。对于一般类型和谓词,这是不可能的,或者至少难以自动化。

于 2014-06-06T23:59:51.063 回答