¿Existe una buena razón por la que el tipo de Prelude.read sea
read :: Read a => String -> a
en lugar de devolver un Maybe
valor?
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 Left
contendría la cadena original si no se analizara y Right
el 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.
take
acepta ningunoNum a => a
? ¿Por qué hay un caso especial defmap
listas de for? ¿Por quéFunctor
no es obligatorio para lasMonad
instancias? Espero que la respuesta sea similar a las respuestas a estas y otras preguntas relacionadas.readMaybe
que pronto se agregue una función.take
ser asíIntegral n => n -> [a] -> [a]
?Integral
, noNum
: un pedo cerebral.Respuestas:
Editar : A partir de GHC 7.6,
readMaybe
está disponible en elText.Read
mó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
maybeRead
funció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 a
clase de tipo:readMaybe :: Read a => String -> Maybe a
Aparte 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 . show
sea la identidad (para los tipos que son una instancia deShow
yRead
) y esashow . read
es la identidad en el rango deshow
(es decirshow . read . show == show
)Tener un
Maybe
en el tipo deread
rompe 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 a
yreadThing :: 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
readMaybe
no 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
readMaybe
que 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
safe
paquete, obtiene una versión correcta dereadMaybe
disponible (se llamareadMay
y 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