2015-01-14 14 views
13

ví dụ từ Haskell http://learnyouahaskell.com/types-and-typeclassesHaskell Prelude.read: không phân tích cú pháp Chuỗi

ghci> read "5" :: Int 
5 
ghci> read "5" :: Float 
5.0 
ghci> (read "5" :: Float) * 4 
20.0 
ghci> read "[1,2,3,4]" :: [Int] 
[1,2,3,4] 
ghci> read "(3, 'a')" :: (Int, Char) 
(3, 'a') 

nhưng khi tôi cố gắng

read "asdf" :: String 

hoặc

read "asdf" :: [Char] 

tôi nhận được ngoại lệ

Prelude.read No Parse

Tôi đang làm gì sai ở đây?

Trả lời

28

Điều này là do các đại diện chuỗi bạn có không phải là chuỗi đại diện của một String, nó cần dấu ngoặc kép nhúng trong chuỗi chính nó:

> read "\"asdf\"" :: String 
"asdf" 

Điều này là để read . show === id cho String:

> show "asdf" 
"\"asdf\"" 
> read $ show "asdf" :: String 
"asdf" 

Là một lưu ý phụ, thay vào đó hãy sử dụng hàm readMaybe từ Text.Read:

> :t readMaybe 
readMaybe :: Read a => String -> Maybe a 
> readMaybe "asdf" :: Maybe String 
Nothing 
> readMaybe "\"asdf\"" :: Maybe String 
Just "asdf" 

Điều này tránh (theo ý kiến ​​của tôi) bị hỏng read chức năng làm tăng ngoại lệ khi phân tích lỗi.

Các vấn đề liên quan