遍历 'filtered' 的最后一个元素

Traversal over last element of 'filtered'

我正在寻找过滤遍历,然后 select 与 over 一起使用的最后一个元素。

例如像这样的东西(但实际上会编译):

[1,2,3,4] & traverse . filtered even . _last +~ 10
> [1,2,3,14]

有什么想法吗?

P.S。我知道 filtered 仅在不影响遍历中的元素数量时才有效。

我正在执行的实际用例是 select 仅匹配某些谓词的递归 uniplate 遍历的最低级别;如果您对如何执行此操作有其他想法,我很乐意听取他们的意见!

[1,2,3,4] & partsOf (traverse . filtered even) . _last +~ 10

这不是真正的答案,只是@Gurkenglas 的后续跟进,它太大而无法发表评论。请注意@Gurkenglas 的回答:

let t = partsOf (traverse . filtered even) . _last

可能看起来像一个遍历,但它不是,即使你保持元素计数,因为它违反了第二个遍历法则(原因很明显):

let f = Identity . succ
[1,2,3,4] & fmap (t f) . t f  -- yields [1,3,3,5] effectively
[1,2,3,4] & getCompose . t (Compose . fmap f . f)
                              -- yields [1,2,3,6] effectively

要成为遍历,您必须将 元素计数 过滤 属性 保持为不变量.

我不知道这对你的应用程序是否重要,但请注意 partsOf 带有这些警告,文档误导性地暗示 partsOf 的结果如果您保持元素数量,将是一个镜头。 (partsOf each 是这样,文档中给出的示例,但不是一般情况。)