假设我有一个这样的数组:[1, 2, 3, 4]
如何使用镜头包仅修改偶数值?我正在寻找类似的东西:
filterLens even (+10) $ [1, 2, 3, 4]
=> [1, 12, 3, 14]
答案 0 :(得分:7)
Prelude Control.Lens> [1, 2, 3, 4] & each . filtered even %~ (+ 10)
[1, 12, 3, 14]
要查找此类功能,您可以指示Google通过将“+镜头”放入搜索字段来搜索镜头包。在这种情况下:http://www.haskell.org/hoogle/?hoogle=%2Blens+filter
答案 1 :(得分:1)
好吧,如果我们看一下我们想要的类型
evens :: Lens' [a] [a]
似乎它应该是一个有效的镜头,只要我们不重点关注焦点列表的长度。因此,使用吸气剂和固定对进行构建相对容易。
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
但是如果我们密切注意设定功能,我们会发现实施完整滤镜镜头有困难:我们滥用了这个事实,即我们知道镜头目标的确切结构。通用filterLens需要能够重建订单以仅使用它的块来重建总类型。对于一般类型和谓词,这是不可能的,或者至少很难自动化。