GHC.Read
| Авторские права | (c) Университет Глазго 1994-2002 |
|---|---|
| Лицензия | см. libraries/base/LICENSE |
| Поддержка | cvs-ghc@haskell.org |
| Стабильность | внутренняя |
| Переносимость | непереносимая (расширения GHC) |
| Безопасный Haskell | Достоверный |
| Язык | Haskell2010 |
Описание
Класс Read и его экземпляры для основных типов данных.
класс Read a где Исходный код
Разбор String, генерирующий значения.
Производные экземпляры Read делают следующие предположения, которым подчиняются производные экземпляры Show:
- Если конструктор определен как инфиксный оператор, то производный экземпляр
Readбудет анализировать только инфиксные применения конструктора (а не префиксную форму). - Ассоциативность не используется для сокращения скобок, хотя приоритет может быть использован.
- Если конструктор определен с помощью синтаксиса записи, производный экземпляр
Readбудет анализировать только форму синтаксиса записи, и, более того, поля должны быть указаны в том же порядке, что и в исходном объявлении. - Производный экземпляр
Readдопускает произвольные пробелы Haskell между токенами входной строки. Допускаются также дополнительные скобки.
Например, при объявлениях
infixr 5 :^: data Tree a = Leaf a | Tree a :^: Tree a
производный экземпляр Read в Haskell 2010 эквивалентен
instance (Read a) => Read (Tree a) where
readsPrec d r = readParen (d > app_prec)
(\r -> [(Leaf m,t) |
("Leaf",s) <- lex r,
(m,t) <- readsPrec (app_prec+1) s]) r
++ readParen (d > up_prec)
(\r -> [(u:^:v,w) |
(u,s) <- readsPrec (up_prec+1) r,
(":^:",t) <- lex s,
(v,w) <- readsPrec (up_prec+1) t]) r
where app_prec = 10
up_prec = 5
Обратите внимание, что правоассоциативность :^: не используется.
Производный экземпляр в GHC эквивалентен
instance (Read a) => Read (Tree a) where
readPrec = parens $ (prec app_prec $ do
Ident "Leaf" <- lexP
m <- step readPrec
return (Leaf m))
+++ (prec up_prec $ do
u <- step readPrec
Symbol ":^:" <- lexP
v <- step readPrec
return (u :^: v))
where app_prec = 10
up_prec = 5
readListPrec = readListPrecDefault
Почему существуют и readsPrec, и readPrec, и почему GHC выбирает реализацию readPrec в производных экземплярах Read вместо readsPrec? Причина в том, что readsPrec основана на типе ReadS, и хотя ReadS упоминается в отчёте Haskell 2010, это не очень эффективный тип данных для парсера.
readPrec, с другой стороны, основан на гораздо более эффективном типе данных ReadPrec (также известном как "парсеры нового стиля"), но его определение основано на использовании расширения языка RankNTypes. Поэтому readPrec (и его родственник readListPrec) помечены как специфичные для GHC. Тем не менее, рекомендуется использовать readPrec вместо readsPrec всякий раз, когда это возможно, для повышения эффективности.
Как уже упоминалось, производные экземпляры Read в GHC будут реализовывать readPrec вместо readsPrec. Стандартные реализации readsPrec (и его родственника, readList) просто используют readPrec под капотом. Если вы пишете экземпляр Read вручную, рекомендуется сделать это следующим образом:
instance Read T where readPrec = ... readListPrec = readListPrecDefault
Методы
Аргументы
| :: Int | приоритет оператора окружающего контекста (число от |
| -> ReadS a |
пытается проанализировать значение с начала строки, возвращая список пар (проанализированное значение, оставшаяся строка). Если успешного разбора нет, возвращаемый список пуст.
Производные экземпляры Read и Show удовлетворяют следующему:
То есть readsPrec анализирует строку, созданную showsPrec, и возвращает значение, с которым showsPrec стартовало.
readList :: ReadS [a] Исходный код
Метод readList предоставляется, чтобы дать программисту специализированный способ парсинга списков значений. Например, это используется предопределенным экземпляром Read типа Char, где значения типа String должны использовать двойные кавычки, а не квадратные скобки.
readPrec :: ReadPrec a Исходный код
Предлагаемая замена для readsPrec с использованием парсеров нового стиля (только GHC).
readListPrec :: ReadPrec [a] Исходный код
Предлагаемая замена для readList с использованием парсеров нового стиля (только GHC). Стандартное определение использует readList. Экземпляры, определяющие readPrec, должны также определить readListPrec как readListPrecDefault.
Определено в GHC.Read | |
| Read Lexeme | С момента: base-2.1 |
Определено в GHC.Read МетодыreadsPrec :: Int -> ReadS Lexeme Исходный код readList :: ReadS [Lexeme] Исходный код | |
| Read IOMode | С момента: base-4.2.0.0 |
Определено в GHC.IO.IOMode МетодыreadsPrec :: Int -> ReadS IOMode Исходный код readList :: ReadS [IOMode] Исходный код | |
| Read IntPtr | |
Определено в Foreign.Ptr МетодыreadsPrec :: Int -> ReadS IntPtr Исходный код readList :: ReadS [IntPtr] Исходный код | |
| Read WordPtr | |
Определено в Foreign.Ptr МетодыreadsPrec :: Int -> ReadS WordPtr Исходный код readList :: ReadS [WordPtr] Исходный код | |
| Read CUIntMax | |
Определено в Foreign.C.Types МетодыreadsPrec :: Int -> ReadS CUIntMax Исходный код readList :: ReadS [CUIntMax] Исходный код | |
| Read CIntMax | |
Определено в Foreign.C.Types МетодыreadsPrec :: Int -> ReadS CClock Исходный код readList :: ReadS [CClock] Исходный код | |
| Read CSigAtomic | |
Определено в Foreign.C.Types МетодыreadsPrec :: Int -> ReadS CSigAtomic Исходный код readList :: ReadS [CSigAtomic] Исходный код | |
| Read CWchar | |
Определено в Foreign.C.Types МетодыreadsPrec :: Int -> ReadS CWchar Исходный код readList :: ReadS [CWchar] Исходный код | |
| Read CSize | |
Определено в Foreign.C.Types МетодыreadsPrec :: Int -> ReadS CSize Исходный код readList :: ReadS [CSize] Исходный код | |
| Read CPtrdiff | |
Определено в Foreign.C.Types МетодыreadsPrec :: Int -> ReadS CPtrdiff Исходный код readList :: ReadS [CPtrdiff] Исходный код | |
| Read CDouble | |
Определено в Foreign.C.Types МетодыreadsPrec :: Int -> ReadS CDouble Исходный код readList :: ReadS [CDouble] Исходный код | |
| Read CFloat | |
| Read SomeNat | С версии: base-4.7.0.0 |
| Read SomeSymbol | С версии: base-4.7.0.0 |
Определено в GHC.TypeLits МетодыreadsPrec :: Int -> ReadS SomeSymbol Source readList :: ReadS [SomeSymbol] Source | |
| Read DecidedStrictness | С версии: base-4.9.0.0 |
Определено в GHC.Generics МетодыreadsPrec :: Int -> ReadS DecidedStrictness Source readList :: ReadS [DecidedStrictness] Source | |
| Read SourceStrictness | С версии: base-4.9.0.0 |
Определено в GHC.Generics МетодыreadsPrec :: Int -> ReadS SourceStrictness Source readList :: ReadS [SourceStrictness] Source | |
| Read SourceUnpackedness | С версии: base-4.9.0.0 |
Определено в GHC.Generics МетодыreadsPrec :: Int -> ReadS SourceUnpackedness Source readList :: ReadS [SourceUnpackedness] Source | |
| Read Associativity | Since: base-4.6.0.0 |
Defined in GHC.Generics МетодыreadsPrec :: Int -> ReadS Associativity Source readList :: ReadS [Associativity] Source | |
| Read Fixity | Since: base-4.6.0.0 |
| Read Any | Since: base-2.1 |
| Read All | Since: base-2.1 |
| Read SeekMode | Since: base-4.2.0.0 |
| Read NewlineMode | Since: base-4.3.0.0 |
Defined in GHC.IO.Handle.Types МетодыreadsPrec :: Int -> ReadS NewlineMode Source readList :: ReadS [NewlineMode] Source | |
Определено в System.Posix.Types МетодыreadsPrec :: Int -> ReadS CIno Исходный код readList :: ReadS [CIno] Исходный код | |
| Read CDev | |
Определено в System.Posix.Types МетодыreadsPrec :: Int -> ReadS CDev Исходный код readList :: ReadS [CDev] Исходный код | |
| Read Версия | С: base-2.1 |
Определено в Data.Version МетодыreadsPrec :: Int -> ReadS Версия Исходный код readList :: ReadS [Версия] Исходный код | |
| Read Порядок байтов | С: base-4.11.0.0 |
Определено в GHC.ByteOrder | |
| Read Подробности GC | С: base-4.10.0.0 |
Определено в GHC.Stats | |
| Read Статистика RTS | С: base-4.10.0.0 |
Определено в GHC.Stats | |
| Read Void |
Чтение С: base-4.8.0.0 |
| Read a => Read (Identity a) |
Этот экземпляр был бы эквивалентен выведенным экземплярам нового типа С версии: base-4.8.0.0 |
| Read a => Read (ZipList a) | С версии: base-4.7.0.0 |
| Read a => Read (Option a) | С версии: base-4.9.0.0 |
| Read m => Read (WrappedMonoid m) | С версии: base-4.9.0.0 |
Определено в Data.Semigroup МетодыreadsPrec :: Int -> ReadS (WrappedMonoid m) Source readList :: ReadS [WrappedMonoid m] Source readPrec :: ReadPrec (WrappedMonoid m) Source readListPrec :: ReadPrec [WrappedMonoid m] Source | |
| Read a => Read (Last a) | С версии: base-4.9.0.0 |
| Read a => Read (First a) | С версии: base-4.9.0.0 |
| Read a => Read (Const a b) |
Этот экземпляр был бы эквивалентен производным экземплярам С: base-4.8.0.0 |
| Read c => Read (K1 i c p) | С: base-4.7.0.0 |
| (Read (f p), Read (g p)) => Read ((f :+: g) p) | С: base-4.7.0.0 |
| (Read (f p), Read (g p)) => Read ((f :*: g) p) | С: base-4.7.0.0 |
| (Read a, Read b, Read c, Read d) => Read (a, b, c, d) | С: base-2.1 |
Определено в GHC.Generics МетодыreadsPrec :: Int -> ReadS ((f :.: g) p) Исходный код readList :: ReadS [(f :.: g) p] Исходный код readPrec :: ReadPrec ((f :.: g) p) Исходный код readListPrec :: ReadPrec [(f :.: g) p] Исходный код | |
| (Read a, Read b, Read c, Read d, Read e) => Read (a, b, c, d, e) | С момента: base-2.1 |
Определено в GHC.Read МетодыreadsPrec :: Int -> ReadS (a, b, c, d, e) Исходный код readList :: ReadS [(a, b, c, d, e)] Исходный код readPrec :: ReadPrec (a, b, c, d, e) Исходный код readListPrec :: ReadPrec [(a, b, c, d, e)] Исходный код | |
| (Read1 f, Read1 g, Read a) => Read (Compose f g a) | С момента: base-4.9.0.0 |
Определено в Data.Functor.Compose МетодыreadsPrec :: Int -> ReadS (Compose f g a) Исходный код readList :: ReadS [Compose f g a] Исходный код readPrec :: ReadPrec (Compose f g a) Исходный код readListPrec :: ReadPrec [Compose f g a] Исходный код | |
| (Read a, Read b, Read c, Read d, Read e, Read f) => Read (a, b, c, d, e, f) | С момента: base-2.1 |
Определено в GHC.Read МетодыreadsPrec :: Int -> ReadS (a, b, c, d, e, f) Исходный код readList :: ReadS [(a, b, c, d, e, f)] Исходный код readPrec :: ReadPrec (a, b, c, d, e, f) Исходный код readListPrec :: ReadPrec [(a, b, c, d, e, f)] Исходный код | |
| (Read a, Read b, Read c, Read d, Read e, Read f, Read g) => Read (a, b, c, d, e, f, g) | С момента: base-2.1 |
Определено в GHC.Read МетодыreadsPrec :: Int -> ReadS (a, b, c, d, e, f, g) Исходный код readList :: ReadS [(a, b, c, d, e, f, g)] Исходный код readPrec :: ReadPrec (a, b, c, d, e, f, g) Исходный код readListPrec :: ReadPrec [(a, b, c, d, e, f, g)] Исходный код | |
| (Read a, Read b, Read c, Read d, Read e, Read f, Read g, Read h) => Read (a, b, c, d, e, f, g, h) | С момента: base-2.1 |
| (Read a, Read b, Read c, Read d, Read e, Read f, Read g, Read h, Read i) => Read (a, b, c, d, e, f, g, h, i) | Since: base-2.1 |
| (Read a, Read b, Read c, Read d, Read e, Read f, Read g, Read h, Read i, Read j) => Read (a, b, c, d, e, f, g, h, i, j) | Since: base-2.1 |
| (Read a, Read b, Read c, Read d, Read e, Read f, Read g, Read h, Read i, Read j, Read k) => Read (a, b, c, d, e, f, g, h, i, j, k) | Since: base-2.1 |
Определено в GHC.Read | |
| (Read a, Read b, Read c, Read d, Read e, Read f, Read g, Read h, Read i, Read j, Read k, Read l) => Read (a, b, c, d, e, f, g, h, i, j, k, l) | Since: base-2.1 |
Определено в GHC.Read | |
| (Read a, Read b, Read c, Read d, Read e, Read f, Read g, Read h, Read i, Read j, Read k, Read l, Read m) => Read (a, b, c, d, e, f, g, h, i, j, k, l, m) | Since: base-2.1 |
Определено в GHC.Read МетодыreadsPrec :: Int -> ReadS (a, b, c, d, e, f, g, h, i, j, k, l, m) Исходный код readList :: ReadS [(a, b, c, d, e, f, g, h, i, j, k, l, m)] Исходный код readPrec :: ReadPrec (a, b, c, d, e, f, g, h, i, j, k, l, m) Исходный код readListPrec :: ReadPrec [(a, b, c, d, e, f, g, h, i, j, k, l, m)] Исходный код | |
| (Read a, Read b, Read c, Read d, Read e, Read f, Read g, Read h, Read i, Read j, Read k, Read l, Read m, Read n) => Read (a, b, c, d, e, f, g, h, i, j, k, l, m, n) | С момента: base-2.1 |
Определено в GHC.Read МетодыreadsPrec :: Int -> ReadS (a, b, c, d, e, f, g, h, i, j, k, l, m, n) Исходный код readList :: ReadS [(a, b, c, d, e, f, g, h, i, j, k, l, m, n)] Исходный код readPrec :: ReadPrec (a, b, c, d, e, f, g, h, i, j, k, l, m, n) Исходный код readListPrec :: ReadPrec [(a, b, c, d, e, f, g, h, i, j, k, l, m, n)] Исходный код | |
| (Read a, Read b, Read c, Read d, Read e, Read f, Read g, Read h, Read i, Read j, Read k, Read l, Read m, Read n, Read o) => Read (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o) | С момента: base-2.1 |
Определено в GHC.Read МетодыreadsPrec :: Int -> ReadS (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o) Исходный код readList :: ReadS [(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o)] Исходный код readPrec :: ReadPrec (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o) Исходный код readListPrec :: ReadPrec [(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o)] Исходный код | |
type ReadS a = String -> [(a, String)] Исходный код
Парсер для типа a, представленный как функция, которая принимает String и возвращает список возможных парсеров в виде (a,String) пар.
Обратите внимание, что этот вид парсера с возвратом очень неэффективен; чтение большой структуры может быть довольно медленным (см. ReadP).
lex :: ReadS String Исходный код
Функция lex считывает одно лексему из входных данных, игнорирует начальные пробелы и возвращает символы, составляющие лексему. Если строка ввода содержит только пробелы, lex возвращает единственный успешный `lexeme', состоящий из пустой строки. (Таким образом lex "" = [("","")].) Если в начале входной строки нет законной лексемы, lex терпит неудачу (т.е. возвращает []).
Этот лексический анализатор не полностью соответствует синтаксису Haskell в следующих отношениях:
- Квалифицированные имена обрабатываются неправильно
- Восьмеричные и шестнадцатеричные числа не распознаются как один токен
- Комментарии не обрабатываются должным образом
lexLitChar :: ReadS String Исходный код
Прочитайте строковое представление символа, используя соглашения об эскейпах языка Haskell. Например:
lexLitChar "\\nHello" = [("\\n", "Hello")]
readLitChar :: ReadS Char Исходный код
Прочитайте строковое представление символа, используя соглашения об эскейпах языка Haskell, и преобразуйте его в символ, который он кодирует. Например:
readLitChar "\\nHello" = [('\n', "Hello")]
lexDigits :: ReadS String Исходный код
Считывает непустую строку десятичных цифр.
lexP :: ReadPrec Lexeme Исходный код
Разбор одной лексемы
expectP :: Lexeme -> ReadPrec () Исходный код
paren :: ReadPrec a -> ReadPrec a Исходный код
(paren p) разбирает "(P0)", где p разбирает "P0" в контексте приоритета ноль
parens :: ReadPrec a -> ReadPrec a Исходный код
(parens p) парсит "P", "(P0)", "((P0))" и т.д., где p парсит "P" в текущем контексте приоритета, а парсит "P0" в контексте приоритета ноль
list :: ReadPrec a -> ReadPrec [a] Source
(list p) парсит список элементов, полученных с помощью p, используя обычный синтаксис в квадратных скобках.
choose :: [(String, ReadPrec a)] -> ReadPrec a Source
Парсит указанный лексему и продолжает по указанию. Особенно полезно для нульарных конструкторов; например, choose [("A", return A), ("B", return B)] Мы сопоставляем как Ident, так и Symbol, потому что конструктор может быть оператором, например (:~:)
readListDefault :: Read a => ReadS [a] Source
Возможная замена определения для метода readList (только GHC). Это необходимо только для GHC и даже тогда только для Read экземпляров, где readListPrec не определено как readListPrecDefault.
readListPrecDefault :: Read a => ReadPrec [a] Source
Возможная замена определения для метода readListPrec, определенного с использованием readPrec (только GHC).
readNumber :: Num a => (Lexeme -> ReadPrec a) -> ReadPrec a Source
readField :: String -> ReadPrec a -> ReadPrec a Source
Read парсер для поля записи в формате fieldName=value. fieldName должно быть идентификатором в алфавитно-цифровом формате; для имён полей в стиле символов (операторов), например, (#), используйте readSymField). Второй аргумент — парсер для значения поля.
readFieldHash :: String -> ReadPrec a -> ReadPrec a Source
Read парсер для поля записи в формате fieldName#=value. То есть алфавитно-цифрового идентификатора fieldName за которым следует символ #. Второй аргумент — парсер для значения поля.
Обратите внимание, что readField не подходит для этой цели из-за #5041.
readSymField :: String -> ReadPrec a -> ReadPrec a Source
Read парсер для поля записи в стиле символа в формате (###)=value (где ### — имя поля). Имя поля должно быть символом (оператором), например, (#). Для обычных (алфавитно-цифровых) имён полей используйте readField. Второй аргумент — парсер для значения поля.
readParen :: Bool -> ReadS a -> ReadS a Source
readParen True p парсит то, что парсит p, но заключённое в скобки.
readParen False p парсит то, что парсит p, но необязательно заключённое в скобки.
© The University of Glasgow and others
Licensed under a BSD-style license (see top of the page).
https://downloads.haskell.org/~ghc/8.10.2/docs/html/libraries/base-4.14.1.0/GHC-Read.html