将可能附加到 Elm 中的列表

Append Maybe to List in Elm

我有一个 List a 和一个 Maybe a。如果它是 Just a 我想附加可能的值,但如果它是 Nothing.

则什么也不做

这是我目前使用的:

aList ++ case maybeValue of
           Just value ->
             [ value ]
           Nothing ->
             []

是否有更好(更惯用)的方法来做到这一点?

请注意,如果有更简洁的方法,那么前置也很好。列表顺序无关紧要。

我想你可以使用 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

上试试

如果您想要简洁,可以使用 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]

现在,中缀版本是否是惯用的 Elm,还有待商榷。如果它是您经常使用的东西,也许它是值得的,但大多数 Elm 指南都敦促您避免使用中缀运算符,因为它们会阻碍可发现性。

最后,您的原始示例具有可读性强并且可能更容易理解的好处,因为熟悉 unwrap 的人会更少。唯一的建议是,如果顺序真的无关紧要,那么将项目添加到列表前会比串联列表更快。

根据 Chad 的建议,前置成本更低:

prependMaybe : List a -> Maybe a -> List a
prependMaybe list maybe =
   case maybe of
           Just value ->
             value :: list
           Nothing ->
             list