Text.Read
| Авторские права | (c) Университет Глазго 2001 |
|---|---|
| Лицензия | BSD-стиль (см. файл libraries/base/LICENSE) |
| Поддержка | libraries@haskell.org |
| Устойчивость | временная |
| Переносимость | непереносимо (использует Text.ParserCombinators.ReadP) |
| Safe Haskell | Надёжный |
| Язык | Haskell2010 |
Содержание
Описание
Преобразование строк в значения.
Библиотека Text.Read — это стандартная библиотека для импорта возможностей класса Read. Только для GHC она предлагает расширенный и значительно улучшенный класс Read, который представляет собой предлагаемую альтернативу классу Haskell 2010 Read. В частности, написание парсеров проще, а парсеры намного эффективнее.
Класс Read
class Read a where Исходный код
Парсинг Strings, генерирующий значения.
Производные экземпляры 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
Методы
Аргументы
| :: 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.
Экземпляры
| Read a => Read [a] | |
| (Integral a, Read a) => Read (Ratio a) | |
| Read (U1 p) | |
| Read p => Read (Par1 p) | |
| Read a => Read (Maybe a) | |
| Read a => Read (Down a) | |
| Read a => Read (Last a) | |
| Read a => Read (First a) | |
| Read a => Read (Product a) | |
| Read a => Read (Sum a) | |
| Read a => Read (Dual a) | |
| Read a => Read (ZipList a) | |
| Read a => Read (Complex a) | |
| HasResolution a => Read (Fixed a) | |
| Read a => Read (Identity a) | Этот экземпляр был бы эквивалентен выведенным экземплярам нового типа |
| (Read a, Read b) => Read (Either a b) | |
| Read (f p) => Read (Rec1 f p) | |
| (Read a, Read b) => Read (a, b) | |
| Read (Proxy k s) | |
| Read a => Read (Const a b) | |
| Read c => Read (K1 i c p) | |
| (Read (f p), Read (g p)) => Read ((:+:) f g p) | |
| (Read (f p), Read (g p)) => Read ((:*:) f g p) | |
| Read (f (g p)) => Read ((:.:) f g p) | |
| (Read a, Read b, Read c) => Read (a, b, c) | |
| (~) k a b => Read ((:~:) k a b) | |
| Coercible k a b => Read (Coercion k a b) | |
| Read (f a) => Read (Alt k f a) | |
| Read (f p) => Read (M1 i c f p) | |
| (Read a, Read b, Read c, Read d) => Read (a, b, c, d) | |
| (Read a, Read b, Read c, Read d, Read e) => Read (a, b, c, d, e) | |
| (Read a, Read b, Read c, Read d, Read e, Read f) => Read (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) | |
| (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) | |
| (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) | |
| (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) | |
| (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) | |
| (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) | |
| (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) | |
| (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) |
type ReadS a = String -> [(a, String)] Source
A parser for a type a, represented as a function that takes a String and returns a list of possible parses as (a,String) pairs.
Note that this kind of backtracking parser is very inefficient; reading a large structure may be quite slow (cf ReadP).
Функции Haskell 2010
reads :: Read a => ReadS a Source
equivalent to readsPrec with a precedence of 0.
read :: Read a => String -> a Source
Функция read считывает входные данные из строки, которая должна быть полностью использована процессом ввода.
readParen :: Bool -> ReadS a -> ReadS a Source
readParen True p анализирует то, что p анализирует, но заключённое в скобки.
readParen False p анализирует то, что p анализирует, но необязательно заключённое в скобки.
Функция lex считывает один лексем из входных данных, отбрасывает начальные пробелы и возвращает символы, составляющие лексем. Если строка ввода содержит только пробелы, lex возвращает один успешный `лексем`, состоящий из пустой строки. (Таким образом, lex "" = [("","")].) Если в начале строки ввода нет допустимого лексема, lex завершается неудачей (т. е. возвращает []).
Этот лексический анализатор не полностью соответствует синтаксису Haskell в следующих аспектах:
- Квалифицированные имена не обрабатываются должным образом
- Восьмеричные и шестнадцатеричные числовые значения не распознаются как один токен
- Комментарии не обрабатываются должным образом
Новые функции разбора
module Text.ParserCombinators.ReadPrec
Конструкторы
| Char Char | Лексема-символ |
| String String | Лексема-строка, со с интерпретацией экранирований |
| Punc String | Пунктуация или зарезервированный символ, например, |
| Ident String | Идентификатор Haskell, например, |
| Symbol String | Символ Haskell, например, |
| Number Number | С версии: 4.6.0.0 |
| EOF |
lexP :: ReadPrec Lexeme Source
Анализ одного лексема
parens :: ReadPrec a -> ReadPrec a Source
(parens p) анализирует "P", "(P0)", "((P0))" и т. д., где p анализирует "P" в текущем контексте приоритета и анализирует "P0" в контексте приоритета ноль
readListDefault :: Read a => ReadS [a] Source
Возможная замена определения метода readList (только GHC). Это необходимо только для GHC и даже тогда только для Read экземпляров, где readListPrec не определено как readListPrecDefault.
readListPrecDefault :: Read a => ReadPrec [a] Source
Возможная замена определения метода readListPrec, определённого с использованием readPrec (только GHC).
readEither :: Read a => String -> Either String a Source
Разбор строки с использованием экземпляра Read. Успешно, если существует ровно один допустимый результат. Значение Left указывает на ошибку разбора.
С версии: 4.6.0.0
readMaybe :: Read a => String -> Maybe a Source
Разбор строки с использованием экземпляра Read. Успешно, если существует ровно один допустимый результат.
С версии: 4.6.0.0
© The University of Glasgow and others
Licensed under a BSD-style license (see top of the page).
https://downloads.haskell.org/~ghc/7.10.3/docs/html/libraries/base-4.8.2.0/Text-Read.html