我有一个 [(a, Maybe b)]
,想要得到一个 [(a, b)]
,其中过滤掉所有第二个元素是Nothing
的对。
是否有一种简洁的方式使用 lens 描述这个操作?
你觉得这个怎么样?
[('a',Just 1),('b',Nothing)]^..folded.aside _Just
使用(^..)
和folded
来自Control.Lens.Fold
,以及aside
和_Just
来自Control.Lens.Prism
。
关键在于aside
,这是一个方便的函数,它可以从作用于元组组成部分的棱镜构建一个作用于整个元组的棱镜。
尽管这些镜头非常巧妙,但以下内容可能是简洁的标志:
[ (a, b) | (a, Just b) <- list ]
(更不用说可读性了。)
mapMaybe sequenceA :: [(a, Maybe b)] -> [(a,b)]
Data.Traversable
、Data.Maybe
并拥有一个 Traversable ((,) a)
实例。我让读者自己想一想这是如何工作的。
<-
进行模式匹配失败时,会调用相应 monad 的fail
函数,对于列表来说,这个函数是[]
。 - sdcvvc