Ale*_*ing 6 haskell haskell-lens
想象一下,我有以下列表:
lst :: [(Bool, Maybe Integer)]
lst = [(True, Just 3), (True, Nothing), (False, Just 12)]
Run Code Online (Sandbox Code Playgroud)
使用镜头库,我想提取元组的元素,但我只希望它在第二个元素时成功Just
.我想要一些split
像这样工作的光学元件:
> lst ^.. folded.split (_1.to not) (_2._Just)
[(False, 3), (True, 12)]
Run Code Online (Sandbox Code Playgroud)
我可以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))
Run Code Online (Sandbox Code Playgroud)
......似乎有效.然而,这似乎我必须重新发明轮子.镜头库是否已经提供了以同样好的方式完成此操作的内容?
该aside
组合子需要Prism
的作品在一个元组的第二个组成部分,并返回Prism
该作品在整个元组:
ghci> lst ^.. folded.aside _Just
[(True,3),(False,12)]
Run Code Online (Sandbox Code Playgroud)
生成的棱镜在组件匹配时匹配,否则失败.
将它与to
和结合起来bimap
,我们可以重现你的例子:
ghci> lst ^.. folded.aside _Just.to (bimap not id)
[(False,3),(True,12)]
Run Code Online (Sandbox Code Playgroud)
要处理第一个组件,我们可以使用swapped
:
ghci> [(Just 3,False)]^..folded.swapped.aside _Just.swapped
[(3,False)]
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
94 次 |
最近记录: |