Ответ 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
которая вызывает исключение при сбое анализа.