尝试读取 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
。我使用从互联网复制的以下功能来做到这一点:
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 的最佳方法是什么?