111 votes

Pourquoi ne pas Haskell Prélude.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 un Maybe de la valeur?

read :: Read a => String -> Maybe a

Depuis la chaîne peut ne pas être parseable Haskell, ne serait pas le dernier être de plus naturel?

Ou même un Either String aLeft permettrait de contenir la chaîne d'origine si elle n'a pas analyser, et Right le résultat si c'était le cas?

Edit:

Je ne cherche pas à en amener d'autres à écrire un wrapper correspondante pour moi. Juste besoin d'être rassurés qu'il est sécuritaire de le faire.

112voto

sclv Points 25335

Edit: Comme de GHC 7.6, readMaybe est disponible dans l' Text.Read bibliothèque de base, avec readEither: http://hackage.haskell.org/packages/archive/base/latest/doc/html/Text-Read.html#v:readMaybe


Excellente question! Le type de lecture elle-même n'est pas de changer de sitôt, parce que ce serait casser beaucoup de choses. Cependant, il devrait être un maybeRead fonction.

Pourquoi n'est-il pas? La réponse est "inertie". Il y avait une discussion dans '08 qui a déraillé par une discussion sur "l'échec".

La bonne nouvelle, c'est que les gens ont été suffisamment convaincu de commencer à se déplacer loin de l'échec dans les bibliothèques. La mauvaise nouvelle est que la proposition s'est perdu dans le shuffle. Il devrait être une fonction de ce genre, bien qu'il soit facile à écrire (et il y a des millions de très similaire versions flottant autour de plusieurs bases de code).

Voir aussi cette discussion.

Personnellement, j'utilise la version du paquet sûr.

32voto

augustss Points 15750

Ouais, ça serait bien pratique avec une fonction de lecture qui renvoie Peut-être. Vous pouvez faire un vous-même:

readMaybe :: (Read a) => String -> Maybe a
readMaybe s = case reads s of
              [(x, "")] -> Just x
              _ -> Nothing

15voto

yatima2975 Points 4191

En dehors de l'inertie et/ou de nouvelles idées, une autre raison pourrait être que c'est esthétiquement agréable d'avoir une fonction qui peut agir comme une sorte d'inverse d' show. Qui est, vous voulez qu' read . show est l'identité (pour les types qui sont une instance de Show et Read) et qu' show . read est l'identité sur la plage de show (c - show . read . show == show)

Avoir un Maybe dans le type d' read brise la symétrie avec show :: a -> String.

12voto

lpsmith Points 461

@Augustss souligné, vous pouvez faire votre propre sécurité la fonction de lecture. Cependant, son readMaybe n'est pas totalement cohérente avec le lire, comme il ne l'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 lire dans le Haskell 98 rapport, nous pouvons la modifier pour mettre en œuvre un readMaybe qui est parfaitement cohérent avec read, et ce n'est pas trop gênant, car toutes les fonctions qu'il dépend sont définis dans le Préambule:

readMaybe        :: (Read a) => String -> Maybe a
readMaybe s      =  case [x | (x,t) <- reads s, ("","") <- lex t] of
                         [x] -> Just x
                         _   -> Nothing

8voto

amindfv Points 4668

Cette fonction (appelée readMaybe) est maintenant en Haskell prélude! (Comme de l'actuelle base -- 4.6)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X