Siempre encuentro con el siguiente error al intentar leer un ByteString:
Prelude.read: no parse
¿Cuál es la mejor forma de convertir ByteString en Int?
He aquí una muestra de código que hará que este error se produzca antes de mostrarlo en un navegador:
factSplice :: SnapletSplice App App
factSplice = do
mbstr <- getParam "input" -- returns user input as bytestring
let str = maybe (error "splice") show mbstr
let n = read str :: Int
return [X.TextNode $ T.pack $ show $ product [1..n]]
O tal más simplemente:
simple bs = read (show bs) :: Int
Por alguna razón, después de show bs
la cadena resultante incluye citas. Para evitar el error, tengo que eliminar las comillas, entonces read
. utilizo la siguiente función de copiado de internet para hacerlo:
sq :: String -> String
sq [email protected][c] = s
sq ('"':s) | last s == '"' = init s
| otherwise = s
sq ('\'':s) | last s == '\'' = init s
| otherwise = s
sq s = s
Entonces simple bs = read (sq.show bs) :: Int
funciona como se espera.
- ¿Por qué es este el caso?
- ¿Cuál es la mejor manera de convertir una ByteString en una Int?
Para mí, la pregunta n. ° 2 aún no está clara, o puede tratarse de un caso de uso más específico del que tengo curiosidad y creo que está relacionado con esta pregunta inicial: ¿Qué pasa si hay algún tipo de " campo de longitud "que se analiza como ByteString de longitud 4, que de hecho describe un Int32. ¿Su solución alternativa propuesta sigue siendo válida? Como una solución más cómoda, estaba buscando una biblioteca que pueda tomar un tipo de ByteString y devolverá la Int. Correcta. ¿Hay alguna biblioteca que pueda manejar este caso de uso? –