Haskell Prelude.read: 没有解析字符串
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]
我遇到异常
Prelude.read No Parse
我做错了什么?
这是因为您拥有的字符串表示不是 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
函数,该函数在解析失败时引发异常。
来自 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]
我遇到异常
Prelude.read No Parse
我做错了什么?
这是因为您拥有的字符串表示不是 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
函数,该函数在解析失败时引发异常。