【发布时间】:2019-09-06 14:44:34
【问题描述】:
在 Elm 中,我有一个类似的列表:
[ Just a, Nothing, Just b]
我想从中提取:
[a, b]
使用 List.map 和模式匹配是不允许的,除非我错了,因为当列表中的值为 Nothing 时,我无法返回任何内容。 我怎样才能做到这一点?
【问题讨论】:
在 Elm 中,我有一个类似的列表:
[ Just a, Nothing, Just b]
我想从中提取:
[a, b]
使用 List.map 和模式匹配是不允许的,除非我错了,因为当列表中的值为 Nothing 时,我无法返回任何内容。 我怎样才能做到这一点?
【问题讨论】:
如果您不想要任何额外的依赖项,可以使用 List.filterMap 和 identity 函数:
List.filterMap identity [ Just a, Nothing, Just b ]
filterMap 看起来和工作起来很像map,除了映射函数应该返回一个Maybe b 而不仅仅是一个b,并且会打开并过滤掉任何Nothings。因此,使用identity 函数将有效地展开并过滤掉Nothings,而无需实际进行任何映射。
或者,您可以使用elm-community/maybe-extra 中的Maybe.Extra.values:
Maybe.Extra.values [ Just a, Nothing, Just b ]
【讨论】:
通常在这种情况下,我会使用这样的辅助函数:
extractMbVal =
List.foldr
(\mbVal acc ->
case mbVal of
Just val ->
val :: acc
Nothing ->
acc
)
[]
【讨论】: