parsing haskell types

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 .