haskell - 应用两个折叠或 setter/getter ,只有当两者都成功时才成功

标签 haskell haskell-lens

想象一下,我有以下列表:

lst :: [(Bool, Maybe Integer)]
lst = [(True, Just 3), (True, Nothing), (False, Just 12)]

使用镜头库,我想提取元组的元素,但我只希望它在第二个元素为Just时成功.我想要一些眼镜,split像这样工作:
> lst ^.. folded.split (_1.to not) (_2._Just)
[(False, 3), (True, 12)]

我可以实现split我自己是这样的:
split :: Getting (First a) s a -> Getting (First b) s b -> Fold s (a, b)
split a b = folding (\x -> (,) <$> (x ^? a) <*> (x ^? b))

…这似乎有效。但是,这似乎我必须重新发明轮子。镜头库是否已经提供了以同样好的方式完成此任务的东西?

最佳答案

aside 组合器采用 Prism它适用于元组的第二个组件并返回 Prism适用于整个元组:

ghci> lst ^.. folded.aside _Just
[(True,3),(False,12)]

当组件匹配时,生成的棱镜匹配,否则失败。

将其与 to 结合使用和 bimap ,我们可以重现您的示例:
ghci> lst ^.. folded.aside _Just.to (bimap not id)
[(False,3),(True,12)]

要处理第一个组件,我们可以使用 swapped :
ghci> [(Just 3,False)]^..folded.swapped.aside _Just.swapped
[(3,False)]

关于haskell - 应用两个折叠或 setter/getter ,只有当两者都成功时才成功,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45334723/

相关文章:

haskell - 是否可以懒惰地获取 Traversable 的所有上下文?

haskell - 这是 Template Haskell 的预期行为吗?

haskell - 如果索引列表遍历不匹配,则返回 ‘Nothing’

list - 尝试在 Haskell 中编写一个函数,根据 -Wall 我需要一个匹配的模式 (_ :_:_) _ What does this pattern mean and why do I need it?

haskell - 声明式编程中的实习字符串

haskell - 三便士中基于行为的动态元素

json - 具有错误处理功能的 Aeson 和 Lenses

haskell - 为什么 Haskell 给出这段代码的解析错误?

haskell I/O,putStrLn 应用于两个参数

haskell - 如何在类 map 容器中将镜头定义为总和类型?