是否有一种不那么冗长的方式来解开榆树中的可能值

tan*_*man 7 functional-programming elm

我一直在榆树中经常遇到一个问题,我的功能取决于多个可能的值是Just.编写此代码有一种不那么冗长的方式:

commandIf apples bananas oranges =
        case apples of
            Just apples_ ->
                case bananas of
                    Just bananas_ ->
                        case oranges of
                            Just oranges_ ->
                                someCommand apples_ bananas_ oranges_

                            Nothing ->
                                Cmd.none

                    Nothing ->
                        Cmd.none

            Nothing ->
                Cmd.none
Run Code Online (Sandbox Code Playgroud)

win*_*elt 10

@ laughedelic的回答非常好.只是想提供一些替代的和更通用的解决方案,因为冗长的Maybe解包是我在Elm开始时遇到的问题.

如果您有固定数量的Maybe,则可以使用map2, map3etc来执行您想要的操作(此处为docs):

commandIf apples bananas oranges =
  Maybe.map3 someCommand apples bananas oranges
  |> Maybe.withDefault Cmd.none
Run Code Online (Sandbox Code Playgroud)

这里,someCommand你的函数是3个参数,并返回一些命令.

Maybe.map3仅当所有3个变量都是Just x,并且将其包装在一个Maybe类型中时才应用此函数.所以结果就是Just (someCommand apples bananas oranges)如果所有3都有一个值.否则,函数返回Nothing.

然后将这个结果"管道"进去Maybe.withDefault.Cmd.none如果输入是Nothing,则返回a ,否则返回值(您的命令),而不是Just.

如果你有一个Maybe未知长度列表,你可以这样做:

keepOnlyJusts : List (Maybe a) -> List a
keepOnlyJusts listOfMaybes =
  listOfMaybes
  |> List.filterMap identity

newList = keepOnlyJusts [ Just 1, Nothing, Just 3 ]   -- == [1,3]
Run Code Online (Sandbox Code Playgroud)

其中结果是一个列表(可能为空),其中只保留值.


lau*_*lic 9

如果您同时需要所有三个值,则可以将它们作为元组匹配,并将所有其他组合(当其中一个或多个组合时)保留Nothing为后备情况:

commandIf apples bananas oranges =
  case (apples, bananas, oranges) of
    (Just apples_, Just bananas_, Just oranges_) ->
        someCommand apples_ bananas_ oranges_

    _ ->
        Cmd.none
Run Code Online (Sandbox Code Playgroud)