elm - significa - Cadena a la conversión int usando la función toInt
funcion cint visual basic (6)
Aquí se explica cómo proporcionar la conversión con un valor predeterminado en caso de que falle el análisis.
String.toInt "5" |> Result.toMaybe |> Maybe.withDefault 0
Estoy tratando de convertir una cadena a un entero usando String.toInt. Sin embargo, cuando quiero vincular el resultado a una variable y luego hacer algunos cálculos simples con él, obtengo este error:
La función
add
está esperando que el segundo argumento sea:
Int
Pero es:
Result String Int
¿Cómo puedo simplemente extraer la parte entera del resultado?
De acuerdo con la here , si está extrayendo un número de alguna entrada sin procesar del usuario, normalmente querrá usar Result.withDefault
para manejar los datos Result.withDefault
en caso de que falle el análisis. Puedes encadenar esta operación usando tuberías para un código más limpio:
String.toInt "5" |> Result.withDefault 0
El entero también se puede sacar usando
Result.withDefault 0 (String.toInt "2")
Puedes leer más sobre esto here
El método withDefault
obliga a definir un valor que se puede usar para los cálculos, pero no siempre es posible establecer un valor que sea significativo para los errores. La mayoría de las veces necesitas todos los valores posibles, y el valor predeterminado no es el adecuado. Aquí proporciono una función de verificación de tipo de resultado que puede usar para decidir si usa o no el valor convertido:
isErrorResult r =
case r of
Err msg ->
True
Ok value ->
False
Puedes usarlo así:
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
el valor default
(0 en este caso) pasado a withDefault
tiene sentido, porque nos aseguramos de que r
no sea un Err
.
Usa el mapa:
answer = Result.map2 (+) (String.toInt "1") (String.toInt "2")
map2 :
Aplique una función a dos resultados, si ambos resultados están bien. Si no, el primer argumento que es un Err se propagará.
tener el resultado de add
como una cadena
resultAsString r =
case r of
Err msg -> msg
Ok value -> toString value
resultAsString answer
para facilitar las cosas puedes crear una función addStrings
:
addStrings : String -> String -> Result String Int
addStrings a b =
Result.map2 (+) (String.toInt a) (String.toInt b)
Incluso puede salirse con el tipo de 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
Pruebas
import Html exposing (Html, text)
main : Html msg
main =
text (addStrings "1" "2")
output 3
toInt puede fallar en el análisis. Necesita comprobarlo usando una declaración de caso:
case toInt str of
Err msg -> ... -- do something with the error message
Ok val -> ... -- val is an Int which you can add