在Elm中附加可能列表

时间:2017-08-09 18:49:47

标签: list elm maybe

我有List aMaybe a。如果它是Just a,我想附加可能值,但如果它是Nothing则不执行任何操作。

这就是我目前使用的:

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

这样做有更好的(更惯用的)方法吗?

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

3 个答案:

答案 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。唯一的建议是,如果订单真的无关紧要,那么将一个项目添加到列表中将比连接列表更快。