¿Existe una buena razón por la que el tipo de Prelude.read sea
read :: Read a => String -> a
en lugar de devolver un Maybevalor?
read :: Read a => String -> Maybe a
Dado que la cadena podría no ser analizable Haskell, ¿no sería esto último más natural?
O incluso Either String a, ¿dónde Leftcontendría la cadena original si no se analizara y Rightel resultado si lo hiciera?
Editar:
No estoy tratando de que otros me escriban una envoltura correspondiente. Solo busco la tranquilidad de que es seguro hacerlo.

takeacepta ningunoNum a => a? ¿Por qué hay un caso especial defmaplistas de for? ¿Por quéFunctorno es obligatorio para lasMonadinstancias? Espero que la respuesta sea similar a las respuestas a estas y otras preguntas relacionadas.readMaybeque pronto se agregue una función.takeser asíIntegral n => n -> [a] -> [a]?Integral, noNum: un pedo cerebral.Respuestas:
Editar : A partir de GHC 7.6,
readMaybeestá disponible en elText.Readmódulo en el paquete base, junto conreadEither: http://hackage.haskell.org/packages/archive/base/latest/doc/html/Text-Read.html#v: readMaybe¡Gran pregunta! El tipo de lectura en sí no cambiará pronto porque eso rompería muchas cosas. Sin embargo, debería haber una
maybeReadfunción.¿Por qué no está ahí? La respuesta es "inercia". Hubo una discusión en el '08 que se descarriló por una discusión sobre "fallar".
La buena noticia es que la gente estaba lo suficientemente convencida como para empezar a alejarse del fracaso en las bibliotecas. La mala noticia es que la propuesta se perdió en la confusión. No debería ser una función de este tipo, aunque uno es fácil escribir (y hay infinidad de versiones muy similares que flotan alrededor de muchas bases de código).
Vea también esta discusión .
Personalmente, utilizo la versión del paquete seguro .
fuente
Sí, sería útil con una función de lectura que devuelva Quizás. Puedes hacer uno tú mismo:
fuente
Read aclase de tipo:readMaybe :: Read a => String -> Maybe aAparte de la inercia y / o los cambios de percepción, otra razón podría ser que es estéticamente agradable tener una función que pueda actuar como una especie de inverso de
show. Es decir, quiere queread . showsea la identidad (para los tipos que son una instancia deShowyRead) y esashow . reades la identidad en el rango deshow(es decirshow . read . show == show)Tener un
Maybeen el tipo dereadrompe la simetría conshow :: a -> String.fuente
newtype ValidShow a = ValidShow String. El tipo fantasma lo hace más seguro para los tipos.showThing :: Show a => a -> ValidShow ayreadThing :: Read a => ValidShow a -> a, para que el tipo de cosa que se mostró se recuerde en el objeto ValidShow. De esta forma no puedes escribirreadThing (showThing True) :: String.Como señaló @augustss, puede crear su propia función de lectura segura. Sin embargo, su
readMaybeno es completamente consistente con read, ya que no ignora los espacios en blanco al final de una cadena. (Cometí este error una vez, no recuerdo bien el contexto)Mirando la definición de lectura en el informe Haskell 98 , podemos modificarla para implementar una
readMaybeque sea perfectamente consistente conread, y esto no es demasiado inconveniente porque todas las funciones de las que depende están definidas en el Preludio:fuente
safepaquete, obtiene una versión correcta dereadMaybedisponible (se llamareadMayy es idéntica a esta versión.¡Esta función (llamada
readMaybe) está ahora en el preludio de Haskell! (A partir de la base actual - 4.6)fuente