Преобразование строки в int с использованием функции toInt

Я пытаюсь преобразовать строку в целое число, используя String.toInt. Однако, когда я хочу привязать результат к переменной, а затем выполнить с ней простую математику, я получаю эту ошибку:

Функция add ожидает, что второй аргумент будет:

Int

Но это:

Result String Int

Как я могу просто извлечь целую часть результата?


elm
person Mahdi    schedule 18.12.2015    source источник


Ответы (8)


toInt может не пройти синтаксический анализ. Вам нужно проверить это с помощью оператора case:

case toInt str of
  Err msg -> ... -- do something with the error message
  Ok val -> ... -- val is an Int which you can add

Подробнее о Result здесь

person Chad Gilbert    schedule 18.12.2015
comment
Для Elm 0.19 toInt возвращает Maybe Int вместо Result, поэтому этот ответ уже неверен. - person CoderDennis; 22.08.2019

Вот как предоставить преобразованию значение по умолчанию в случае сбоя синтаксического анализа.

String.toInt "5" |> Result.toMaybe |> Maybe.withDefault 0
person d13    schedule 24.01.2016
comment
Это поведение изменилось? для меня этот код работал вместо «String.toInt newContent |› Maybe.withDefault 0». Я использую elm-версию 0.19.0 и не понимаю, почему вместо результата я получаю сообщение «Может быть». - person frithjof; 29.09.2018

Целое число также можно получить с помощью

Result.withDefault 0 (String.toInt "2")

Подробнее об этом можно прочитать здесь

person Sumit Surana    schedule 21.12.2016

Согласно справочной документации Elm String, если вы извлекаете число из некоторого необработанного пользовательского ввода, вы, как правило, захотите использовать Result.withDefault для обработки неверных данных в случае сбоя синтаксического анализа. Вы можете связать эту операцию, используя каналы для более чистого кода:

String.toInt "5" |> Result.withDefault 0
person akdev    schedule 11.02.2018

Использовать карту:

answer = Result.map2 (+) (String.toInt "1") (String.toInt "2")

map2:

Примените функцию к двум результатам, если оба результата в порядке. Если нет, первый аргумент, который является ошибкой, будет распространяться.

чтобы получить результат add в виде строки

resultAsString r =
    case r of
        Err msg -> msg
        Ok value -> toString value

resultAsString answer

чтобы упростить задачу, вы можете создать функцию addStrings:

addStrings : String -> String -> Result String Int
addStrings a b =
    Result.map2 (+) (String.toInt a) (String.toInt b)

Вы даже можете вообще обойтись без типа Result:

addStrings : String -> String -> String
addStrings a b =
    let
        r =
            Result.map2 (+) (String.toInt a) (String.toInt b)
    in
    case r of
        Err msg ->
            msg

        Ok value ->
            toString value

Тестирование

import Html exposing (Html, text)

main : Html msg
main =
    text (addStrings "1" "2")


output 3
person Alfgaar    schedule 16.02.2018

Метод withDefault вынуждает вас определять значение, которое можно использовать для вычислений, но не всегда возможно установить значение, значимое для ошибок. Чаще всего нужны все возможные значения, а по умолчанию не подходят. Здесь я предоставляю функцию проверки типа результата, которую вы можете использовать, чтобы решить, используете ли вы преобразованное значение или нет:

isErrorResult r =
    case r of
        Err msg ->
            True

        Ok value ->
            False

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

r = String.toInt "20b"

if isErrorResult r then
    -- not a valid Interger, abort or whatever
else
    -- a good integer, extract it
    a = Result.withDefault 0 r
    -- and make good use of it

значение default (в данном случае 0), переданное в withDefault, не имеет смысла, потому что мы убедились, что r не является Err.

person Alfgaar    schedule 17.02.2018

Вы можете сделать это, как показано ниже.

---- Elm 0.19.0 ----------------------------------------------------------------
Read <https://elm-lang.org/0.19.0/repl> to learn more: exit, help, imports, etc.
--------------------------------------------------------------------------------
> parseInt string = String.toInt string
<function> : String -> Maybe Int
> resultParseInt string = \
|   Result.fromMaybe ("error parsing string: " ++ string) (parseInt string)
<function> : String -> Result String Int
> resultParseInt "12"
Ok 12 : Result String Int
> resultParseInt "12ll"
Err ("error parsing string: 12ll") : Result String Int
>
person Arup Rakshit    schedule 16.11.2018

Я немного изменил ответы парней, так как они, похоже, относятся к типу «Может быть».

isErrorResult : String -> Bool
isErrorResult r =
case String.toInt r of
    Nothing -> True
    Just value -> False
person Дмитрий Завориин    schedule 01.12.2018