Haskell Prelude.read:没有解析字符串

Her*_*ler 23 haskell

来自haskell的例子http://learnyouahaskell.com/types-and-typeclasses

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')  
Run Code Online (Sandbox Code Playgroud)

但是当我尝试

read "asdf" :: String 
Run Code Online (Sandbox Code Playgroud)

要么

read "asdf" :: [Char]
Run Code Online (Sandbox Code Playgroud)

我得到例外

Prelude.read No Parse

我在这做错了什么?

bhe*_*ilr 38

这是因为您拥有的字符串表示形式不是a的字符串表示形式String,它需要嵌入字符串本身的引号:

> read "\"asdf\"" :: String
"asdf"
Run Code Online (Sandbox Code Playgroud)

这是read . show === id为了String:

> show "asdf"
"\"asdf\""
> read $ show "asdf" :: String
"asdf"
Run Code Online (Sandbox Code Playgroud)

作为旁注,改为使用以下readMaybe函数总是一个好主意Text.Read:

> :t readMaybe
readMaybe :: Read a => String -> Maybe a
> readMaybe "asdf" :: Maybe String
Nothing
> readMaybe "\"asdf\"" :: Maybe String
Just "asdf"
Run Code Online (Sandbox Code Playgroud)

这避免了(在我看来)破坏的read函数,该函数在解析失败时引发异常.