遍历 '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
是这样,文档中给出的示例,但不是一般情况。)
我正在寻找过滤遍历,然后 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
是这样,文档中给出的示例,但不是一般情况。)