应用两个折叠或吸气剂,只有在两者成功时才能成功

时间:2017-07-26 18:23:08

标签: 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))

......似乎有效。然而,这似乎我必须重新发明轮子。镜头库是否已经提供了以同样好的方式实现这一目标的东西?

1 个答案:

答案 0 :(得分:6)

aside组合子获取一个Prism,它在元组的第二个组件上工作,并返回一个适用于整个元组的Prism

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

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

将其与tobimap相结合,我们可以重现您的示例:

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)]