tôi luôn luôn gặp phải lỗi sau khi cố gắng đọc một ByteString:
Prelude.read: no parse
Cách tốt nhất để chuyển đổi ByteString thành Int là gì?
Đây là một mẫu mã mà sẽ gây ra lỗi này xảy ra khi render trong một trình duyệt:
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]]
Hoặc có lẽ đơn giản hơn:
simple bs = read (show bs) :: Int
Vì lý do nào đó, sau show bs
chuỗi kết quả bao gồm dấu ngoặc kép. Vì vậy, để có được xung quanh các lỗi tôi phải loại bỏ các dấu ngoặc kép sau đó read
nó. tôi sử dụng hàm sau sao chép từ internet để làm như vậy:
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
Sau đó simple bs = read (sq.show bs) :: Int
công trình như mong đợi.
- Tại sao lại xảy ra trường hợp này?
- Cách tốt nhất để chuyển đổi ByteString thành Int là gì?
Đối với tôi câu hỏi số 2 vẫn không rõ ràng - hoặc nó có thể chỉ là trường hợp sử dụng cụ thể hơn mà tôi tò mò và tôi nghĩ là liên quan đến câu hỏi ban đầu này: Điều gì sẽ xảy ra nếu có một số loại " lĩnh vực chiều dài "được phân tích cú pháp như một ByteString của chiều dài 4, trong đó thực tế mô tả một Int32. Giải pháp được đề xuất của bạn có còn hợp lệ không? Như một giải pháp thoải mái hơn, tôi đã tìm kiếm một thư viện có thể lấy loại ByteString như vậy và sẽ trả về đúng Int. Có thư viện nào có thể xử lý trường hợp sử dụng này không? –