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)
其中结果是一个列表(可能为空),其中只保留值.
如果您同时需要所有三个值,则可以将它们作为元组匹配,并将所有其他组合(当其中一个或多个组合时)保留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)