我有List a
和Maybe a
。如果它是Just a
,我想附加可能值,但如果它是Nothing
则不执行任何操作。
这就是我目前使用的:
aList ++ case maybeValue of
Just value ->
[ value ]
Nothing ->
[]
这样做有更好的(更惯用的)方法吗?
请注意,如果有更简洁的方法,那么前置也很好。列表顺序无关紧要。
答案 0 :(得分:3)
我认为您可以使用Maybe.map List.singleton yourMaybe |> Maybe.withDefault []
。
这里有一个完整的例子:
appendMaybe : List a -> Maybe a -> List a
appendMaybe list maybe =
Maybe.map List.singleton maybe
|> Maybe.withDefault []
|> (++) list
您可以在Ellie
上试用答案 1 :(得分:3)
根据乍得的建议,预先支出更便宜:
prependMaybe : List a -> Maybe a -> List a
prependMaybe list maybe =
case maybe of
Just value ->
value :: list
Nothing ->
list
答案 2 :(得分:2)
如果您想要简明扼要,可以使用elm-community/maybe-extra
包中的Maybe.Extra.unwrap
:
import Maybe.Extra exposing (unwrap)
consMaybe : List a -> Maybe a -> List a
consMaybe list =
unwrap list (flip (::) list)
appendMaybe : List a -> Maybe a -> List a
appendMaybe list =
unwrap list ((++) list << List.singleton)
如果你真的想发疯,可以创建自己的中缀运营商:
infixr 5 ::?
(::?) = flip consMaybe
infixr 5 ++?
(++?) = appendMaybe
这允许以下内容:
Nothing ::? [2, 3, 4] == [2, 3, 4]
Just 1 ::? [2, 3, 4] == [1, 2, 3, 4]
[2, 3, 4] ++? Nothing == [2, 3, 4]
[2, 3, 4] ++? Just 5 == [2, 3, 4, 5]
现在,中缀版本是否是惯用的榆树,这是辩论。如果它是你经常使用的东西,也许它是值得的,但是大多数榆树指南都敦促你避免使用中缀操作符,因为它们阻碍了可发现性。
最后,您的原始示例具有可读性且可能更容易理解的优点,因为较少的人会熟悉unwrap
。唯一的建议是,如果订单真的无关紧要,那么将一个项目添加到列表中将比连接列表更快。