过滤 [Maybe a] 并丢弃 Nothing 值

Filter over [Maybe a] and discard Nothing values

对于Maybe a的列表,如何过滤并只取列表中不属于Nothing的元素?

-- input
pas = [Just 3, Just 1, Just 5, Just 9, Nothing, Just 10, Nothing] :: [Maybe Int]

-- expected output
new_pas = [3, 1, 5, 9, 10]

我尝试了不同的使用方式 map 并查看了 mapMaybe 但找不到正确的组合。

在输入问题时我找到了答案,实际上很简单:

new_pas = [pa | Just pa <- pas]
-- [3, 1, 5, 9, 10]

把它放在这里是为了让其他人用谷歌搜索同样的问题。

除了您发现的简单列表理解之外,已经有一个库函数:catMaybes

请注意,您不仅可以搜索 Hoogle 名称,还可以搜索类型签名 - 这在很多情况下都非常有用。在这里输入 [Maybe a] -> [a] 会立即为您提供 catMaybes。 (告白:我忘记了函数的名称,但知道它存在,所以才找到它!)

is quite nice. Yet, I also like the way Data.Maybe.mapMaybe you mentioned (note that it is just one line under Data.Maybe.catMaybe spoken of in by Robin Zigmond) 可以在这里使用:

unwrapJusts :: [Maybe a] -> [a]
unwrapJusts = mapMaybe id

你的例子:

GHCi> unwrapJusts [Just 3, Just 1, Just 5, Just 9, Nothing, Just 10, Nothing]
[3,1,5,9,10]

这个想法相当简单:当遍历列表时 mapMaybe id 抛出所有 Nothings(即 id Nothings)并将 Just xs 变成xs.