J'essaie de convertir une chaîne en entier à l'aide de String.toInt. Cependant, lorsque je veux lier le résultat à une variable et ensuite faire quelques calculs simples avec elle, j'obtiens cette erreur:
La fonction
add
s'attend à ce que le deuxième argument soit:Int
Mais il est:
Result String Int
Comment puis-je simplement extraire la partie entière du résultat?
toInt peut échouer dans l'analyse. Vous devez le vérifier en utilisant une déclaration de cas:
case toInt str of
Err msg -> ... -- do something with the error message
Ok val -> ... -- val is an Int which you can add
Voici comment fournir à la conversion une valeur par défaut en cas d'échec de l'analyse.
String.toInt "5" |> Result.toMaybe |> Maybe.withDefault 0
Le nombre entier peut également être extrait en utilisant
Result.withDefault 0 (String.toInt "2")
Vous pouvez en lire plus à ce sujet ici
Selon la documentation de référence Elm String , si vous extrayez un nombre à partir d'une entrée utilisateur brute, vous souhaiterez généralement utiliser Result.withDefault
pour traiter les données incorrectes en cas d'échec de l'analyse. Vous pouvez chaîner cette opération en utilisant des tubes pour un code plus propre:
String.toInt "5" |> Result.withDefault 0
La méthode withDefault
vous oblige à définir une valeur pouvant être utilisée pour des calculs, mais il n'est pas toujours possible d'établir une valeur significative pour les erreurs. Le plus souvent, vous avez besoin de toutes les valeurs possibles et la valeur par défaut n’est pas adaptée. Ici, je fournis une fonction de vérification du type de résultat que vous pouvez utiliser pour décider si vous utilisez ou non la valeur convertie:
isErrorResult r =
case r of
Err msg ->
True
Ok value ->
False
Vous pouvez l'utiliser comme ceci:
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
la valeur default
(0 dans ce cas) passée à withDefault
n'a pas de sens, car nous nous sommes assurés que r
n'est pas une Err
.
J'ai un peu changé les réponses des gars, car il semble être de type Peut-être
isErrorResult : String -> Bool
isErrorResult r =
case String.toInt r of
Nothing -> True
Just value -> False
Utiliser la carte:
answer = Result.map2 (+) (String.toInt "1") (String.toInt "2")
map2 :
Appliquez une fonction à deux résultats, si les deux sont corrects. Sinon, le le premier argument qui est un Err se propagera.
avoir le résultat add
sous forme de chaîne
resultAsString r =
case r of
Err msg -> msg
Ok value -> toString value
resultAsString answer
pour faciliter les choses, vous pouvez créer une fonction addStrings
:
addStrings : String -> String -> Result String Int
addStrings a b =
Result.map2 (+) (String.toInt a) (String.toInt b)
Vous pouvez même vous échapper avec le type 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
Essai
import Html exposing (Html, text)
main : Html msg
main =
text (addStrings "1" "2")
output 3
Vous pouvez le faire comme ci-dessous.
---- 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
>