Я всегда сталкиваюсь со следующей ошибкой при попытке прочитать ByteString:
Prelude.read: no parse
Вот пример кода, который приведет к возникновению этой ошибки при рендеринге в браузере:
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
it.Для этого я использую следующую функцию, скопированную из Интернета:
sq :: String -> String
sq s@[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?