Короче говоря : вы анализируете текстовое представление типа Maybe a
, , а не a
как неполную функцию, где Nothing
используется для указания ошибки разбора.
Ну read
обычно напротив из show
.Таким образом, он будет анализировать представление объекта, то есть часто , как вы бы записали объект в виде каскада конструкторов данных в объект.
Now Maybe a
является типом семейства Show
, учитывая, что элементы, которые он оборачивает, также являются экземпляром Show
, что-то вроде:
instance Show a => Show (Maybe a) where
show Nothing = "Nothing"
show (Just x) = "Just "++ show x
(На самом деле это немного сложнее, так кактакже введет скобки на случай, если вы оберните Just 1
в Just
, например).
Таким образом, можно проанализировать и обратное.Например:
Prelude> read "<b>Nothing</b>" :: Maybe Int
Nothing
Prelude> read "<b>Just</b> 5" :: Maybe Int
Just 5
Таким образом, Maybe a
как тип read
предназначен не для функции " non-total ", а для синтаксического анализа текстового представленияMaybe a
type.
Таким образом, он анализирует строки с префиксом "Nothing"
и "Just"
(а также может анализировать некоторые такие "выражения" в скобках).