試圖讀取字節字符串時,我總是碰到以下錯誤:
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仍然不是很清楚 - 或者它可能只是一個更具體的用例,我很好奇,我認爲它與這個最初的問題有關: 如果某種「長度字段「,它被解析爲長度爲4的ByteString,其實際上描述了一個Int32。您建議的解決方法仍然有效嗎?作爲一個更舒適的解決方案,我正在尋找一個可以接受這種類型的ByteString的庫,並返回正確的Int。有沒有可以處理這個用例的庫? – 2015-03-15 19:12:49