Y a-t-il une bonne raison pour laquelle le type de Prelude.read est
read :: Read a => Ssortingng -> a
plutôt que de renvoyer une valeur Maybe
?
read :: Read a => Ssortingng -> Maybe a
Étant donné que la chaîne pourrait ne pas être lisible, Haskell ne serait-il pas plus naturel?
Ou même une Either Ssortingng a
, où Left
contiendrait la chaîne d’origine si elle n’a pas été analysée, et Right
le résultat si c’était le cas?
Modifier:
Je n’essaie pas d’amener les autres à écrire une enveloppe correspondante pour moi. Je veux juste être rassuré sur le fait qu’il est sécuritaire de le faire.
Edit : A partir de GHC 7.6, readMaybe
est disponible dans la bibliothèque Text.Read
de base, avec readEither
: http://hackage.haskell.org/packages/archive/base/latest/doc/html/Text-Read.html #v: readMaybe
Bonne question! Le type de lecture lui-même ne change pas de sitôt, car cela briserait beaucoup de choses. Cependant, il devrait y avoir une fonction maybeRead
.
Pourquoi n’y a-t-il pas La réponse est “inertie”. Il y a eu une discussion en 2008 qui a déraillé suite à une discussion sur “l’échec”.
La bonne nouvelle est que les gens étaient suffisamment convaincus pour s’éloigner des échecs dans les bibliothèques. La mauvaise nouvelle est que la proposition a été perdue dans le brouhaha. Il devrait y avoir une telle fonction, bien qu’il soit facile d’écrire (et il y a des zillions de versions très similaires flottant autour de plusieurs bases de code).
Voir aussi cette discussion .
Personnellement, j’utilise la version du package sécurisé .
Oui, ce serait pratique avec une fonction de lecture qui retourne Maybe. Vous pouvez en créer un vous-même:
readMaybe :: (Read a) => Ssortingng -> Maybe a readMaybe s = case reads s of [(x, "")] -> Just x _ -> Nothing
Mis à part l’inertie et / ou l’évolution des idées, une autre raison pourrait être que, d’un sharepoint vue esthétique, il est souhaitable d’avoir une fonction capable d’agir comme une sorte d’inverse du show
. C’est-à-dire que vous voulez read . show
read . show
est l’identité (pour les types qui sont une instance de Show
et Read
) et cette show . read
show . read
est l’identité de la gamme de show
(ie show . read . show == show
)
Avoir un Maybe
dans le type de read
rompt la symésortinge avec show :: a -> Ssortingng
.
Comme @augustss l’a fait remarquer, vous pouvez créer votre propre fonction de lecture en toute sécurité. Cependant, son readMaybe
n’est pas complètement compatible avec read, car il n’ignore pas les espaces à la fin d’une chaîne. (J’ai fait cette erreur une fois, je ne me souviens plus du contexte)
En regardant la définition de read dans le rapport Haskell 98 , on peut la modifier pour implémenter un readMaybe
parfaitement cohérent avec la read
, ce qui n’est pas trop gênant car toutes les fonctions dont il dépend sont définies dans le Prélude:
readMaybe :: (Read a) => Ssortingng -> Maybe a readMaybe s = case [x | (x,t) <- reads s, ("","") <- lex t] of [x] -> Just x _ -> Nothing
Cette fonction (appelée readMaybe
) est maintenant dans le prélude Haskell! (À partir de la base actuelle – 4.6)