镜头-traverseInit发生了什么事?

时间:2018-06-22 11:58:12

标签: haskell lens

在早期版本Data.List.Lens中,有一个函数traverseInit用于操纵部分列表。它已被删除,我想现在可以替代它了,但我找不到吗?

我会怎么做

>>> traverseInit +~ 1 $ [1,2,3]
[2,3,3]

1 个答案:

答案 0 :(得分:4)

traverseInit_init :: Snoc s s a a => Traversal' s s中更通用的Control.Lens.Cons所取代,所以现在它可以与任何类似序列的类型一起使用,从而可以访问其右手端。

ghci> [1,2,3] & _init.traverse +~ 1
[2,3,3]

请注意,_init返回一个Traversal' s s,而不是Traversal' s a,这使您可以替换整个子列表,并可能更改其长度。在示例中,我不得不再次traverse来查看元素。 (_init恰好是一个仿射遍历,这意味着它永远不会返回一个以上的子列表,但这在lens的词汇表中无法表达。)

Control.Lens.Cons包括列表_tail的类似遍历,以及列表_head_last的遍历。