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.

97
demandé sur Bilal Barakat 2011-11-09 18:59:22

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é .

96
répondu sclv 2017-05-23 11:55:05

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
26
répondu augustss 2012-04-28 18:06:58

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 .

14
répondu yatima2975 2011-11-10 12:16:09

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
11
répondu lpsmith 2011-11-10 13:18:01

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

7
répondu amindfv 2013-01-12 21:33:58