我正在寻找过滤遍历,然后选择要与 over
一起使用的最后一个元素。
例如像这样的东西(但实际上会编译):
[1,2,3,4] & traverse . filtered even . _last +~ 10
> [1,2,3,14]
有什么想法吗?
附注我知道 filtered
仅在不影响遍历中的元素数量时才有效。
我正在执行的实际用例是仅选择与某些谓词匹配的递归 uniplate
遍历的最低级别;如果您对如何做到这一点有其他想法,我很想听听!
最佳答案
这并不是真正的答案,只是 @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 every
确实如此,但一般情况并非如此。)
关于haskell - 遍历 'filtered'的最后一个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44621325/