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

标签 haskell haskell-lens

我正在寻找过滤遍历,然后选择要与 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/

相关文章:

haskell - 请给我解释一下单态性限制?

haskell - 如果某些东西不是 Haskell 中的列表

Haskell - 在 Applicative 的情况下,效果顺序是否确定?

haskell - Yesod 的图表解决方案

Haskell 透镜 setter/getter ,比较两个透镜 setter/getter 的值

haskell - 内部模块的跨模块内联

haskell - 证明 Haskell Lens 库中断言的类型等效性的合理性

haskell - 无模板 haskell 的多态透镜

Haskell 使用一级透镜来创建复杂透镜

haskell - 压缩遍历