parsing - ¿Por qué el Prelude.read de Haskell no devuelve un Quiz?
types (5)
¡Esta función (llamada readMaybe
) ahora está en el preludio de Haskell! (A partir de la base actual - 4.6)
¿Hay alguna buena razón por la cual el tipo de Prelude.read es
read :: Read a => String -> a
en lugar de devolver un valor de Maybe
?
read :: Read a => String -> Maybe a
Dado que la cuerda podría no ser analizable Haskell, ¿no sería este último más natural?
O incluso un Either String a
, donde Left
contendría el string original si no se analizara, y Right
el resultado si lo hiciera?
Editar:
No estoy tratando de que otros escriban un contenedor correspondiente para mí. Solo estoy buscando la seguridad de que es seguro hacerlo.
Además de la inercia y / o el cambio de ideas, otra razón podría ser que es estéticamente agradable tener una función que pueda actuar como una especie de inversión del show
. Es decir, quieres que lo read . show
read . show
es la identidad (para los tipos que son una instancia de Show
y Read
) y ese show . read
show . read
es la identidad en el rango de show
(es decir, show . read . show == show
)
Tener un Maybe
en el tipo de read
rompe la simetría con show :: a -> String
.
Como señaló @augustss, puede hacer su propia función de lectura segura. Sin embargo, su readMaybe
no es completamente consistente con la lectura, ya que no ignora los espacios en blanco al final de una cadena. (Cometí este error una vez, no recuerdo bien el contexto)
Al mirar la definición de lectura en el informe Haskell 98 , podemos modificarla para implementar un readMaybe
que sea perfectamente consistente con la read
, y esto no es demasiado inconveniente porque todas las funciones de las que depende están definidas en el Preludio:
readMaybe :: (Read a) => String -> Maybe a
readMaybe s = case [x | (x,t) <- reads s, ("","") <- lex t] of
[x] -> Just x
_ -> Nothing
Sí, sería útil con una función de lectura que devuelve Maybe. Usted puede hacer uno usted mismo:
readMaybe :: (Read a) => String -> Maybe a
readMaybe s = case reads s of
[(x, "")] -> Just x
_ -> Nothing
Editar : a partir de GHC 7.6, readMaybe
está disponible en la biblioteca Text.Read
en la base, junto con readEither
: http://hackage.haskell.org/packages/archive/base/latest/doc/html/Text-Read.html#v:readMaybe
Gran pregunta! El tipo de lectura en sí no está cambiando pronto porque eso rompería muchas cosas. Sin embargo, debería haber una función maybeRead
.
¿Por qué no está allí? La respuesta es "inercia". Hubo una discusión en ''08 que se descarriló por una discusión sobre '''' fracaso ''''.
La buena noticia es que la gente estaba suficientemente convencida de comenzar a alejarse del fracaso en las bibliotecas. La mala noticia es que la propuesta se perdió en la confusión. Debería haber tal función, aunque una es fácil de escribir (y hay millones de versiones muy similares que flotan en muchas bases de código).
Ver también esta discusión .
Personalmente, uso la versión del paquete seguro .