我已经阅读了文档,但我仍然不知道如何在代码中使用Maybe.withDefault。因为从String.toInt中可以得到Int,所以我不能使用+符号来添加我试图转换成整数的值。这是榆树0.19。我怎么才能解决这个问题?
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" ]
]发布于 2019-02-04 03:42:36
withDefault : a -> Maybe a -> a这是一个接收到2个参数的函数(最后一个是返回的值)。
如果a是一个Int,那么我们有:
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 -> X1 param是在第2 param是Nothing之后将返回的param。
因此,如果2 param不是Nothing,则函数将返回第2 param中的值。
最基本的例子是:
-- hard-code 2nd param
withDefault 10 (Just 20) -- this function call results 20
withDefault 10 Nothing -- this function call results 10先进的:
-- 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在您的代码中:
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 Int,Maybe Int的添加将始终返回Maybe Int。
注意:我上面的代码只是为了解释Maybe.withDefault的用法,而不是生产代码。
发布于 2019-02-04 07:53:37
关于你的问题:
String.fromInt返回Maybe Int,这意味着值可以是Just Int或NothingJust 1和Nothing加在一起,甚至把Just 1和Just 2相加Just 1中提取数字,如果它是Nothing (例如0),则需要指定默认值。Maybe.withDefault派上用场的地方。它可以从任何Int中提取Maybe Int (不管是Nothing还是Just)。它需要两个参数:- first is the default value that is used when the second parameter is `Nothing`
- second is the actual `Maybe` value
所以在您的代码中,您可以这样使用它:
{model
| curNum =
String.fromInt <|
(Maybe.withDefault 0 <| String.toInt model.curNum)
+ (Maybe.withDefault 0 <| String.toInt model.mainNum)
}尽管如此,您可以通过在模型中使用Int和在视图中使用String.fromInt来节省所有麻烦。
发布于 2019-02-03 15:28:44
您确实需要一个带有text的字符串,但是您的onClicks可以处理使用Ints的消息。即
button [ onClick (AddNum 7)] [ text "7" ]我建议您也将您的模型更改为使用ints,这样您就完全不必从/到字符串进行任何转换了。
https://stackoverflow.com/questions/54503607
复制相似问题