我有一个[(a, Maybe b)]
,想要获得[(a, b)]
,其中第二个元素Nothing
被过滤掉的所有对。
是否有一种简洁的方法来描述使用镜头的操作?
答案 0 :(得分:10)
像
这样的东西[('a',Just 1),('b',Nothing)]^..folded.aside _Just
使用(^..)
中的folded
和Control.Lens.Fold
以及aside
中的_Just
和Control.Lens.Prism
。
关键是aside
,这是一个方便的功能,它可以在一对棱镜上构建一个棱镜,从棱镜上工作一对组件。
答案 1 :(得分:9)
尽管镜片具有独创性,但以下内容可能是简洁的标志:
[ (a, b) | (a, Just b) <- list ]
(更不用说可读性了。)
答案 2 :(得分:3)
mapMaybe sequenceA :: [(a, Maybe b)] -> [(a,b)]
您需要导入Data.Traversable
,Data.Maybe
并拥有Traversable ((,) a)
个实例。我想知道这对读者有何影响。