Haskell Prelude.read: no parse String



来自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')  

但是当我尝试时

read "asdf" :: String 

read "asdf" :: [Char]

我得到例外

前奏.阅读 无解析

我在这里做错了什么?

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

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

这样read . show === id String

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

作为旁注,最好改用 Text.Read 中的 readMaybe 函数:

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

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

最新更新