Зачем `читать" 1 ":: Может Int` проверка типа? - PullRequest
0 голосов
/ 29 мая 2018

Интересно, почему read "1" :: Maybe Int напечатает проверку и выдаст исключение во время выполнения.

Возможно ли, что read сможет когда-либо вернуть Maybe a?Это то, что Text.Read.readMaybe должен делать.

Prelude> read "1" :: Maybe Int
*** Exception: Prelude.read: no parse

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

Интересно, почему read "1" :: Maybe Int напечатает check

Поскольку "1" имеет тип String и, таким образом, является приемлемым в качестве аргумента для read и Maybe Int реализацийRead и, таким образом, является допустимым в качестве типа возврата Read.

и создает исключение во время выполнения.

Поскольку "1" не является допустимой строкойпредставление Maybe Int.

Возможно ли, что чтение может когда-либо вернуть Maybe a?

Да, например, read "Just 42" :: Maybe Int равно Just 42 иread "Nothing" :: Maybe Int - это Nothing.

Обычно любая строка, которую вы можете получить из show x, где x :: Maybe Int также может быть передана в качестве аргумента read для получения Maybe Int.

Или, в более общем случае, любой вывод show x, где x :: T и T является экземпляром Show и Read, возможно, может быть передан в read для получения значения типа T - хотя, конечно, экземпляры могут быть определены произвольно, поэтому не каждый тип, который реализует Read и Show, обязательно придерживается этого "контракта".

0 голосов
/ 30 мая 2018

Короче говоря : вы анализируете текстовое представление типа 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" (а также может анализировать некоторые такие "выражения" в скобках).

...