Вяз 0.19 - PullRequest
       22

Вяз 0.19

0 голосов
/ 03 февраля 2019

Я прочитал документацию, но я все еще не понимаю, как использовать Maybe.withDefault в моем коде.Поскольку из String.toInt я получаю Maybe 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" ]
    ]

Ответы [ 4 ]

0 голосов
/ 04 февраля 2019

Относительно вашего вопроса:

  1. String.fromInt возвращает Maybe Int, это означает, что значение может быть либо Just Int, либо Nothing
  2. Вы не можете просто добавить, например:Just 1 и Nothing вместе или даже Just 1 и Just 2
  3. Вам нужно каким-то образом извлечь число из Just 1 или указать значение по умолчанию, если оно Nothing (например, 0).
  4. Здесь Maybe.withDefault пригодится.Он может извлекать Int из любого Maybe Int (не имеет значения, является ли он Nothing или Just).Он принимает 2 параметра:

    • first - значение по умолчанию, которое используется, когда вторым параметром является Nothing
    • second - фактическое значение Maybe

Таким образом, в вашем коде вы можете использовать его следующим образом:

{model 
  | curNum = 
      String.fromInt <|
        (Maybe.withDefault 0 <| String.toInt model.curNum) 
        + (Maybe.withDefault 0 <| String.toInt model.mainNum)
}

Сказав все это, вы можете просто избавиться от всех проблем, используя Int s в вашей модели иString.fromInt в ваших взглядах.

0 голосов
/ 04 февраля 2019

Я исправил ошибку, создав функцию, которая преобразует Maybe Int -> Int:

checkInt : Maybe Int -> Int
checkInt x = case x of
    Just y -> y
    Nothing -> 0
0 голосов
/ 04 февраля 2019
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 -> X

1-й параметр - это тот, который будет возвращен, если 2-й параметр равен Nothing.

Так что, если 2-й параметр отсутствует't Nothing тогда функция вернет значение внутри 2-й параметр .

, поэтому базовый пример:

-- 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 гарантирует, что вы всегда получите Int для своего add returned Int расчета.

Без него вывсегда будет получать Maybe Int, а добавление Maybe Int всегда будет возвращать Maybe Int.

Примечание. Мой код выше предназначен только для Maybe.withDefault объяснения использования, а не для производственного кода

0 голосов
/ 03 февраля 2019

Вам нужна строка с text, но ваши onClicks могут работать с сообщениями, которые принимают Ints.то есть

button [ onClick (AddNum 7)] [ text "7" ]

Я предлагаю вам изменить свою модель, чтобы она работала и с целыми числами, и тогда вам вообще не нужно будет выполнять какие-либо преобразования из / в строки

...