Elm 使用toInt函数将字符串转换为整数

Elm 使用toInt函数将字符串转换为整数,elm,Elm,我正在尝试使用string.toInt将字符串转换为整数。但是,当我想将结果绑定到一个变量,然后用它做一些简单的数学运算时,我会得到以下错误: 函数add希望第二个参数为: Int 但事实是: Result String Int 如何提取结果的整数部分?toInt可能无法解析。您需要使用case语句进行检查: case toInt str of Err msg -> ... -- do something with the error message Ok val ->

我正在尝试使用string.toInt将字符串转换为整数。但是,当我想将结果绑定到一个变量,然后用它做一些简单的数学运算时,我会得到以下错误:

函数
add
希望第二个参数为:

Int
但事实是:

Result String Int

如何提取结果的整数部分?

toInt可能无法解析。您需要使用case语句进行检查:

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

以下是如何在解析失败的情况下为转换提供默认值

String.toInt "5" |> Result.toMaybe |> Maybe.withDefault 0

也可以使用

Result.withDefault 0 (String.toInt "2")
您可以阅读有关它的更多信息,根据,如果您从一些原始用户输入中提取一个数字,通常需要使用
Result.withDefault
来处理错误数据,以防解析失败。您可以使用管道链接此操作以获取更干净的代码:

String.toInt "5" |> Result.withDefault 0
使用地图:

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

如果两个结果都正常,则对两个结果应用函数。若否,详情为何? 第一个参数是Err,它将通过传播

结果添加为字符串

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)
您甚至可以完全不使用
结果
类型:

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

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

传递给
withDefault
default
值(在本例中为0)没有意义,因为我们确保
r
不是
错误
您可以按以下方式执行此操作

---- 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
>
——Elm 0.19.0----------------------------------------------------------------
阅读了解更多信息:退出、帮助、导入等。
--------------------------------------------------------------------------------
>parseInt string=string.toInt字符串
:String->Maybe Int
>resultParseInt字符串=\
|Result.fromMaybe(“分析字符串时出错:”++string)(parseInt string)
:String->Result String Int
>结果资源点“12”
Ok 12:结果字符串Int
>结果资源点“12ll”
Err(“错误解析字符串:12ll”):结果字符串Int
>

我已经改变了一些答案,因为它似乎是一种类型

isErrorResult : String -> Bool
isErrorResult r =
case String.toInt r of
    Nothing -> True
    Just value -> False

这种行为已经改变了吗?对我来说,这段代码是“String.toInt newContent |>Maybe.withDefault 0”。我使用的是elm版本0.19.0,我不明白为什么我得到的是一个Maybe back而不是Result for elm 0.19
toInt
返回的是
Maybe Int
而不是
Result
,所以这个答案不再正确。
Maybe.withDefault 0 (String.toInt "42")