Y a-t-il une bonne raison pour laquelle le type de Prelude.read est
read :: Read a => String -> a
plutôt que de renvoyer une Maybe
valeur?
read :: Read a => String -> Maybe a
Puisque la chaîne pourrait ne pas être analysable Haskell, cette dernière ne serait-elle pas plus naturelle?
Ou même un Either String a
, où Left
contiendrait la chaîne d'origine si elle n'analysait pas, et Right
le résultat si c'était le cas?
Éditer:
Je n'essaye pas d'amener les autres à écrire un wrapper correspondant pour moi. Je cherche simplement à être assuré qu'il est sécuritaire de le faire.
take
accepte aucunNum a => a
? Pourquoi y a-t-il un cas particulier defmap
pour les listes? Pourquoi n'est-ilFunctor
pas obligatoire pour lesMonad
instances? Je m'attends à ce que la réponse soit similaire aux réponses à ces questions et aux questions connexes.readMaybe
fonction sera bientôt ajoutée.take
êtreIntegral n => n -> [a] -> [a]
?Integral
, pasNum
- péter le cerveau.Réponses:
Edit : À partir de GHC 7.6,
readMaybe
est disponible dans leText.Read
module du package de base, avecreadEither
: http://hackage.haskell.org/packages/archive/base/latest/doc/html/Text-Read.html#v: lirePeut-êtreExcellente question! Le type de lecture lui-même ne changera pas de sitôt car cela casserait beaucoup de choses. Cependant, il devrait y avoir une
maybeRead
fonction.Pourquoi n'y en a-t-il pas? La réponse est «l'inertie». Il y a eu une discussion en 2008 qui a été déraillée par une discussion sur «l'échec».
La bonne nouvelle est que les gens étaient suffisamment convaincus pour commencer à s'éloigner de l'échec dans les bibliothèques. La mauvaise nouvelle est que la proposition s'est perdue dans le shuffle. Il devrait y avoir une telle fonction, même si l'une est facile à écrire (et il existe des millions de versions très similaires flottant autour de nombreuses bases de code).
Voir également cette discussion .
Personnellement, j'utilise la version du package sécurisé .
la source
Ouais, ce serait pratique avec une fonction de lecture qui renvoie Maybe. Vous pouvez en fabriquer un vous-même:
la source
Read a
classe de caractères:readMaybe :: Read a => String -> Maybe a
Outre l'inertie et / ou l'évolution des idées, une autre raison pourrait être qu'il est esthétiquement agréable d'avoir une fonction qui peut agir comme une sorte d'inverse de
show
. Autrement dit, vous voulez que ceread . show
soit l'identité (pour les types qui sont une instance deShow
etRead
) et quishow . read
est l'identité sur la plage deshow
(c'est-à-direshow . read . show == show
)Avoir un
Maybe
dans le type deread
casse la symétrie avecshow :: a -> String
.la source
newtype ValidShow a = ValidShow String
. Le type fantôme le rend plus sûr de type.showThing :: Show a => a -> ValidShow a
etreadThing :: Read a => ValidShow a -> a
, de sorte que le type de l'élément affiché soit mémorisé dans l'objet ValidShow. De cette façon, vous ne pouvez pas écrirereadThing (showThing True) :: String
.Comme @augustss l'a souligné, vous pouvez créer votre propre fonction de lecture sécurisée. 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 ne me souviens pas très bien du contexte)En regardant la définition de read dans le rapport Haskell 98 , nous pouvons la modifier pour implémenter un
readMaybe
qui est parfaitement cohérent avecread
, et ce n'est pas trop gênant car toutes les fonctions dont il dépend sont définies dans le Prelude:la source
safe
package, vous obtenez une version correcte dereadMaybe
available (il s'appellereadMay
et est identique à cette version.Cette fonction (appelée
readMaybe
) est maintenant dans le prélude Haskell! (À partir de la base actuelle - 4,6)la source