Result
El tipo Maybe
puede ayudar con funciones simples que pueden fallar, pero no te dirá por qué falló. Imagina si cada vez que haya algo incorrecto en nuestro código, el compilador sólo nos respondiera: Nothing
. Buena suerte encontrando la causa del error.
Ese es el caso de uso del tipo Result
. Está definido así:
type Result error value
= Ok value
| Err error
El punto de este tipo es dar información adicional cuando algo sale mal. Es muy útil para reportar problemas y recuperarse de errores.
Reportando errores
Tal vez tenemos un sitio web donde la gente ingresa su edad. Podríamos confirmar que la edad ingresada es un número sensato con una función como esta:
isReasonableAge : String -> Result String Int
isReasonableAge input =
case String.toInt input of
Nothing ->
Err "Eso no es un número."
Just age ->
if age < 0 then
Err "Vuelve después de que nazcas."
else if age > 135 then
Err "¿Eres una tortuga o algo así?"
else
Ok age
-- isReasonableAge "abc" == Err ...
-- isReasonableAge "-13" == Err ...
-- isReasonableAge "24" == Ok 24
-- isReasonableAge "150" == Err ...
No sólo podemos revisar la edad, sino que además podemos mostrar mensajes distintos según detalles de lo que ingresaron. Este tipo de retroalimentación es mucho mejor que responder con Nothing
.
Recuperación de errores
El tipo Result
también nos puede ayudar a recuperarnos después de un error. Una situación donde esto se hace necesario es al hacer solicitudes HTTP. Digamos que queremos mostrar el texto completo de Anna Karenina de León Tolstói. Nuestra solicitud retorna un valor Result Error String
para capturar el hecho de que la solicitud puede ser exitosa y contener el texto completo, o tal vez falle en una de varias maneras:
type Error
= BadUrl String
| Timeout
| NetworkError
| BadStatus Int
| BadBody String
-- Ok "All happy ..." : Result Error String
-- Err Timeout : Result Error String
-- Err NetworkError : Result Error String
Teniendo esta información podemos mostrar mejores mensajes de error, como lo mencionamos antes, pero además podríamos probar una rutina de recuperación. Si vemos un error Timeout
, podría servir esperar un poco y reintentar la solicitud. Pero si vemos un valor BadStatus 404
ya sabemos que no tiene caso reintentar.
El próximo capítulo muestra cómo hacer solicitudes HTTP, así que nos volveremos a encontrar con los tipos Result
y Error
muy pronto.