过滤 [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
抛出所有 Nothing
s(即 id Nothing
s)并将 Just x
s 变成x
s.
对于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
。 (告白:我忘记了函数的名称,但知道它存在,所以才找到它!)
Data.Maybe.mapMaybe
you mentioned (note that it is just one line under Data.Maybe.catMaybe
spoken of in
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
抛出所有 Nothing
s(即 id Nothing
s)并将 Just x
s 变成x
s.