首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >榆树0.19 Maybe.withDefault

榆树0.19 Maybe.withDefault
EN

Stack Overflow用户
提问于 2019-02-03 13:57:43
回答 4查看 1.8K关注 0票数 1

我已经阅读了文档,但我仍然不知道如何在代码中使用Maybe.withDefault。因为从String.toInt中可以得到Int,所以我不能使用+符号来添加我试图转换成整数的值。这是榆树0.19。我怎么才能解决这个问题?

代码语言:javascript
复制
import Browser
import Html exposing (Html, button, div, text)
import Html.Events exposing (onClick)


main =
  Browser.sandbox { init = init, update = update, view = view }


-- MODEL

type alias Model = {mainNum : String, curNum : String}

init : Model
init =
  {
      mainNum = ""
      ,curNum = ""
  }

-- UPDATE

type Msg = AddNum String | Add | Clear 

update : Msg -> Model -> Model
update msg model =
  case msg of
    AddNum number ->
        {model | curNum = model.curNum ++ number}

    Add ->
        {model | curNum = String.fromInt ((String.toInt model.curNum) + 
(String.toInt model.mainNum))}

    Clear ->
        init



-- VIEW

view : Model -> Html Msg
view model =
  div []
    [ div [] [ text  model.curNum]
    , button [ onClick (AddNum "1" )] [ text "1" ]
    , button [ onClick (AddNum "2" )] [ text "2" ]
    , button [ onClick (AddNum "3" )] [ text "3" ]
    , div [] []
    , button [ onClick (AddNum "4" )] [ text "4" ]
    , button [ onClick (AddNum "5" )] [ text "5" ]
    , button [ onClick (AddNum "6" )] [ text "6" ]
    , div [] []
    , button [ onClick (AddNum "7" )] [ text "7" ]
    , button [ onClick (AddNum "8" )] [ text "8" ]
    , button [ onClick (AddNum "9" )] [ text "9" ]
    , div [] []
    , button [ onClick (AddNum "0" )] [ text "0" ]
    , button [ onClick Clear] [ text "Clear" ]
    ]
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2019-02-04 03:42:36

代码语言:javascript
复制
withDefault : a -> Maybe a -> a

这是一个接收到2个参数的函数(最后一个是返回的值)。

如果a是一个Int,那么我们有:

代码语言:javascript
复制
withDefault : Int -> Maybe Int -> Int

-- if `a` is a `Float` then we have
withDefault : Float -> Maybe Float -> Float

-- in general, if `a` is an `X` then we have
withDefault : X -> Maybe X -> X

1 param是在第2 paramNothing之后将返回的param。

因此,如果2 param不是Nothing,则函数将返回第2 param中的值。

最基本的例子是:

代码语言:javascript
复制
-- hard-code 2nd param
withDefault 10 (Just 20) -- this function call results 20
withDefault 10 Nothing -- this function call results 10

先进的:

代码语言:javascript
复制
-- 2nd param is Nothing
withDefault 10 (String.toInt "abc") -- this function call results 10

-- 2nd param is not Nothing
withDefault 10 (String.toInt "123") -- this function call results 123

在您的代码中:

代码语言:javascript
复制
Add ->
    let
        cur : Int
        cur =
            Maybe.withDefault 0 (String.toInt model.curNum)

        main : Int
        main =
            Maybe.withDefault 0 (String.toInt model.mainNum)
     in
     { model | curNum = String.fromInt (cur + main) }

如您所见,Maybe.withDefault确保始终接收用于add returned Int计算的Int

没有它,您将始终收到Maybe IntMaybe Int的添加将始终返回Maybe Int

注意:我上面的代码只是为了解释Maybe.withDefault的用法,而不是生产代码。

票数 4
EN

Stack Overflow用户

发布于 2019-02-04 07:53:37

关于你的问题:

  1. String.fromInt返回Maybe Int,这意味着值可以是Just IntNothing
  2. 你不能把Just 1Nothing加在一起,甚至把Just 1Just 2相加
  3. 您需要以某种方式从Just 1中提取数字,如果它是Nothing (例如0),则需要指定默认值。
  4. 这就是Maybe.withDefault派上用场的地方。它可以从任何Int中提取Maybe Int (不管是Nothing还是Just)。它需要两个参数:
代码语言:javascript
复制
- first is the default value that is used when the second parameter is `Nothing`
- second is the actual `Maybe` value

所以在您的代码中,您可以这样使用它:

代码语言:javascript
复制
{model 
  | curNum = 
      String.fromInt <|
        (Maybe.withDefault 0 <| String.toInt model.curNum) 
        + (Maybe.withDefault 0 <| String.toInt model.mainNum)
}

尽管如此,您可以通过在模型中使用Int和在视图中使用String.fromInt来节省所有麻烦。

票数 2
EN

Stack Overflow用户

发布于 2019-02-03 15:28:44

您确实需要一个带有text的字符串,但是您的onClicks可以处理使用Ints的消息。即

代码语言:javascript
复制
button [ onClick (AddNum 7)] [ text "7" ]

我建议您也将您的模型更改为使用ints,这样您就完全不必从/到字符串进行任何转换了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54503607

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档