Pourquoi pas le prélude d'Haskell?lire le retour d'un Peut-être?
Est-il une bonne raison pour laquelle le type de Prélude.lire est
read :: Read a => String -> a
plutôt que de retourner une valeur Maybe
?
read :: Read a => String -> Maybe a
puisque la corde pourrait ne pas être parlable Haskell, cette dernière ne serait-elle pas plus naturelle?
ou même un Either String a
, où Left
contiendrait la chaîne originale si elle ne se parsait pas, et Right
le résultat si elle le faisait?
Edit:
Je n'essaie pas de convaincre les autres d'écrire un papier d'emballage correspondant pour moi. Juste besoin d'être rassurés qu'il est sécuritaire de le faire.
5 réponses
Edit : à partir de GHC 7.6, readMaybe
est disponible dans la bibliothèque Text.Read
en base, avec readEither
: http://hackage.haskell.org/packages/archive/base/latest/doc/html/Text-Read.html#v:readMaybe
grande question! Le type de lecture lui-même ne change pas de sitôt parce que cela briserait beaucoup de choses. Cependant, il devrait être un maybeRead
de la fonction.
pourquoi il n'y en a pas? La réponse est "inertie". Il y avait une discussion en 2008 qui a déraillé par une discussion sur "fail."
la bonne nouvelle est que les gens étaient suffisamment convaincus pour commencer à s'éloigner de l'échec dans les bibliothèques. La mauvaise nouvelle, c'est que la proposition s'est perdue. Il devrait être une telle fonction, bien qu'il soit facile d'écrire (et il y a zillions de versions très similaires flottant autour de nombreux codebases).
Voir aussi cette discussion .
Personnellement, j'utilise la version de la sécurité .
Oui, ce serait pratique avec une fonction de lecture qui retourne peut-être. Vous pouvez le faire vous-même:
readMaybe :: (Read a) => String -> 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 qu'il est esthétique agréable d'avoir une fonction qui peut agir comme une sorte d'inverse de show
. C'est-à-dire que vous voulez que read . show
soit l'identité (pour les types qui sont une instance de Show
et Read
) et que show . read
soit l'identité sur la gamme de show
(i.e. show . read . show == show
)
ayant un Maybe
dans le type de read
casse la symétrie avec show :: a -> String
.
comme @auguss l'a souligné, vous pouvez faire votre propre fonction de lecture sûre. Cependant, son readMaybe
n'est pas complètement cohérent avec read, car il n'ignore pas les espaces à la fin d'une chaîne. (J'ai fait cette erreur une fois, je n'arrive pas à se souvenir du contexte)
en regardant la définition de dans le rapport de Haskell 98 , nous pouvons La Modifier pour mettre en œuvre un readMaybe
qui est parfaitement compatible avec read
, et ce n'est pas trop gênant parce que toutes les fonctions dont il dépend sont définies dans le prélude:
readMaybe :: (Read a) => String -> Maybe a
readMaybe s = case [x | (x,t) <- reads s, ("","") <- lex t] of
[x] -> Just x
_ -> Nothing