我希望过滤遍历,然后选择要与over
一起使用的最后一个元素。
e.g。像这样的东西(但实际上会编译):
[1,2,3,4] & traverse . filtered even . _last +~ 10
> [1,2,3,14]
有什么想法吗?
P.S。我知道filtered
仅在不影响遍历中的元素数量时才有效。
我正在执行的实际用例是仅选择与某个谓词匹配的递归uniplate
遍历的最低级别;如果你对如何做到这一点有其他想法,我很乐意听到它们!
答案 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
来说,这是正确的,这是文档中给出的示例,但不是一般的。)