Как лучше всего преобразовать ByteString в Int?

Я всегда сталкиваюсь со следующей ошибкой при попытке прочитать 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 результирующая строка включает кавычки. Поэтому, чтобы обойти ошибку, мне нужно удалить кавычки, затем прочтите ее. Для этого я использую следующую функцию, скопированную из Интернета:

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 работает должным образом.

  1. Почему это так?
  2. Как лучше всего преобразовать ByteString в Int?
9
задан qubital 16 January 2012 в 23:41
поделиться