2012-06-07 12 views
9

Hay algunas funciones stdlib que arrojan errores en la entrada no válida. Por ejemplo:¿Errores de captura lanzados con `error`?

Prelude> read "1o2" :: Int 
*** Exception: Prelude.read: no parse 

Me gustaría envolver para devolver una Either e a lugar. ¿Cómo puedo hacer eso?

Respuesta

14

There is no spoon. No lo oíste de mí.

Para este ejemplo en particular, debe usar reads en su lugar.

+0

me gusta la forma en que lo expresó. :) ¡Gracias por la respuesta! – missingfaktor

+6

+1 por no mencionar cuchara! – is7s

2

prefiero transformar los errores en los valores:

maybeRead :: Read a => String -> Maybe a 
maybeRead s = case reads s of 
     [(x, "")] -> Just x 
     _   -> Nothing 
+0

Yo también prefiero eso, pero la pregunta es sobre hacerlo _generalmente_. 'leer' se usa solo como ejemplo. – missingfaktor

+0

Creo que generalmente es cierto que, para cualquier función que arroje un error, habrá una versión "segura" de la misma. – MatrixFrog

Cuestiones relacionadas