将可能附加到 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
我有一个 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