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

Что я здесь делаю неправильно?

Ответ 1

Это связано с тем, что строковое представление, которое у вас есть, не является строковым представлением String, ему нужны кавычки, встроенные в строку:

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

Это так, чтобы read. show === id read. show === id для String:

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

В качестве примечания, это всегда хорошая идея, чтобы вместо того, чтобы использовать readMaybe функцию из Text.Read:

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

Это позволяет избежать (по-моему) функции разбитого read которая вызывает исключение при сбое анализа.