Result
Le type Maybe
est très utile pour une fonction pouvant échouer, mais ne nous explique pas pourquoi elle a échoué. Imaginez qu'un compilateur ne vous affiche que “Nothing
” en cas d'erreur au niveau de votre code… Bon courage pour identifier le souci !
C'est en cela que le type Result
est particulièrement utile. Il est défini de cette façon :
type Result error value
= Ok value
| Err error
Son but est de fournir des informations supplémentaires en cas de problème. C'est particulièrement utile pour rapporter les erreurs et réagir plus efficacement quand elles surviennent !
Rapport d'erreur
Reprenons notre exemple d'application dans laquelle les utilisateurs peuvent renseigner leur âge. On pourrait vérifier que l'âge est valide avec une fonction comme celle-ci :
isReasonableAge : String -> Result String Int
isReasonableAge input =
case String.toInt input of
Nothing ->
Err "Ce n'est pas un nombre !"
Just age ->
if age < 0 then
Err "Vous n'êtes pas encore né !"
else if age > 135 then
Err "Êtes-vous une tortue ?"
else
Ok age
-- isReasonableAge "abc" == Err ...
-- isReasonableAge "-13" == Err ...
-- isReasonableAge "24" == Ok 24
-- isReasonableAge "150" == Err ...
Non seulement nous validons l'âge, mais nous pouvons également afficher à nos utilisateurs des messages d'erreur utiles quand ils saisissent n'importe quoi. Ce type de feedback est tout de même bien plus intéressant que Nothing
!
Résilience
Le type Result
peut également vous permettre d'être plus résilient face aux erreurs. Une bonne illustration est le requêtage HTTP. Imaginons vouloir afficher le texte intégral d'Anna Karénine de Léon Tolstoï ; notre requête HTTP retourne un Result Error String
qui modélise le fait que notre requête peut aboutir et nous retourner une String
contenant le contenu de l'œuvre, ou échouer de différentes façons :
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
Dans ce type de cas et comme vu précédemment, nous pouvons afficher des messages très explicites, mais nous pouvons aussi essayer d'effectuer une récupération sur incident ! Si nous obtenons un Timeout
, ça peut valoir le coup d'attendre un peu et retenter la requête. Alors que si nous obtenons un BadStatus 404
, aucun intérêt puisque la ressource n'existe pas ou plus.
Le chapitre suivant aborde comment effectuer des requêtes HTTP, alors préparez-vous à rencontrer les types Result
et Error
à nouveau très vite !