遍历'过滤'的最后一个元素

时间:2017-06-19 02:05:23

标签: haskell lens

我希望过滤遍历,然后选择要与over一起使用的最后一个元素。

e.g。像这样的东西(但实际上会编译):

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

有什么想法吗?

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

我正在执行的实际用例是仅选择与某个谓词匹配的递归uniplate遍历的最低级别;如果你对如何做到这一点有其他想法,我很乐意听到它们!

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

这不是一个真正的答案,只是@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来说,这是正确的,这是文档中给出的示例,但不是一般的。)