я всегда работать в следующую ошибку при попытке чтения байтовой строки:
Prelude.read: no parse
Каков наилучший способ преобразования ByteString в Int?
Вот пример кода, который будет привести к возникновению этой ошибки при оказании в браузере:
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]]
Или, возможно, более просто:
simple bs = read (show bs) :: Int
По какой-то причине, после show bs
результирующая строка включает в кавычки. Итак, чтобы обойти ошибку, я должен удалить цитаты, а затем read
. я использую следующую функцию, скопированную из Интернета, чтобы сделать так:
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
Тогда simple bs = read (sq.show bs) :: Int
работает, как ожидалось.
- Почему это так?
- Каков наилучший способ преобразования ByteString в Int?
На вопрос №2 все еще не так ясно - или это может быть просто более конкретный случай использования. Мне любопытно, и я думаю, что это связано с этим начальным вопросом: Что делать, если есть какой- lenght field ", которое анализируется как ByteString длины 4, что на самом деле описывает Int32. Является ли ваше предлагаемое решение обходным? В качестве более удобного решения я искал библиотеку, которая может принимать такой тип ByteString и вернет правильный Int. Есть ли библиотека, которая может обрабатывать этот прецедент? –