Pourquoi Prelude.read de Haskell ne renvoie-t-il pas Maybe?

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)