Text.Read
| Авторские права | (с) Университет Глазго 2001 |
|---|---|
| Лицензия | BSD-стиль (см. файл libraries/base/LICENSE) |
| Поддержка | libraries@haskell.org |
| Стабильность | предварительная |
| Переносимость | непереносимая (использует Text.ParserCombinators.ReadP) |
| Безопасный Haskell | Надежный |
| Язык | Haskell2010 |
Содержание
Описание
Преобразование строк в значения.
Библиотека Text.Read — это стандартная библиотека для импорта возможностей класса Read. Только для GHC, она предлагает расширенный и значительно улучшенный класс Read, который представляет собой предлагаемую альтернативу классу Haskell 2010 Read. В частности, написание парсеров становится проще, а парсеры намного эффективнее.
Класс Read
class Read a where Исходный код
Парсинг 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.
Примеры
| Read Bool | С момента: base-2.1 |
Определено в GHC.Read МетодыreadsPrec :: Int -> ReadS Bool Исходный код readList :: ReadS [Bool] Исходный код | |
| Read Символ | С момента: base-2.1 |
Определено в GHC.Read МетодыreadsPrec :: Int -> ReadS Символ Исходный код readList :: ReadS [Символ] Исходный код | |
| Read Вещественное число двойной точности | С момента: base-2.1 |
Определено в GHC.Read | |
| Read Число с плавающей точкой | С момента: base-2.1 |
Определено в GHC.Read | |
| Read Целое число | С момента: base-2.1 |
Определено в GHC.Read МетодыreadsPrec :: Int -> ReadS Целое число Исходный код readList :: ReadS [Целое число] Исходный код | |
| Read Int8 | С момента: base-2.1 |
Определено в GHC.Int МетодыreadsPrec :: Int -> ReadS Int8 Исходный код readList :: ReadS [Int8] Исходный код | |
| Read Int16 | С момента: base-2.1 |
Определено в GHC.Int МетодыreadsPrec :: Int -> ReadS Int16 Исходный код readList :: ReadS [Int16] Исходный код | |
| Read Int32 | С момента: base-2.1 |
Определено в GHC.Int МетодыreadsPrec :: Int -> ReadS Int32 Исходный код readList :: ReadS [Int32] Исходный код | |
| Read Int64 | С момента: base-2.1 |
Определено в GHC.Int МетодыreadsPrec :: Int -> ReadS Int64 Исходный код readList :: ReadS [Int64] Исходный код | |
| Read Integer | С момента: base-2.1 |
Определено в GHC.Read МетодыreadsPrec :: Int -> ReadS Integer Исходный код readList :: ReadS [Integer] Исходный код | |
| Read Natural | С момента: base-4.8.0.0 |
Определено в GHC.Read МетодыreadsPrec :: Int -> ReadS Natural Исходный код readList :: ReadS [Natural] Исходный код | |
| Read Ordering | С момента: base-2.1 |
Определено в GHC.Read МетодыreadsPrec :: Int -> ReadS Ordering Исходный код readList :: ReadS [Ordering] Исходный код | |
| Read Word | С момента: base-4.5.0.0 |
Определено в 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 | |
Определено в Foreign.C.Types МетодыreadsPrec :: Int -> ReadS CUInt Исходный код readList :: ReadS [CUInt] Исходный код | |
| Read CInt | |
Определено в Foreign.C.Types МетодыreadsPrec :: Int -> ReadS CInt Исходный код readList :: ReadS [CInt] Исходный код | |
| Read CUShort | |
Определено в Foreign.C.Types МетодыreadsPrec :: Int -> ReadS CUShort Исходный код readList :: ReadS [CUShort] Исходный код | |
| Read CShort | |
Определено в Foreign.C.Types МетодыreadsPrec :: Int -> ReadS CShort Исходный код readList :: ReadS [CShort] Исходный код | |
| Read CUChar | |
Определено в Foreign.C.Types МетодыreadsPrec :: Int -> ReadS CUChar Исходный код readList :: ReadS [CUChar] Исходный код | |
| Read CSChar | |
Определено в Foreign.C.Types МетодыreadsPrec :: Int -> ReadS CSChar Исходный код readList :: ReadS [CSChar] Исходный код | |
| Read CChar | |
Определено в Foreign.C.Types МетодыreadsPrec :: Int -> ReadS CChar Исходный код readList :: ReadS [CChar] Исходный код | |
| Read SomeNat | С момента: base-4.7.0.0 |
Определено в GHC.TypeNats МетодыreadsPrec :: Int -> ReadS SomeNat Исходный код readList :: ReadS [SomeNat] Исходный код | |
| Read SomeSymbol | С момента: base-4.7.0.0 |
Определено в GHC.TypeLits МетодыreadsPrec :: Int -> ReadS SomeSymbol Исходный код readList :: ReadS [SomeSymbol] Исходный код | |
| Read DecidedStrictness | С момента: base-4.9.0.0 |
Определено в GHC.Generics | |
| Read SourceStrictness | С момента: base-4.9.0.0 |
Определено в GHC.Generics | |
| Read SourceUnpackedness | С момента: base-4.9.0.0 |
Определено в GHC.Generics | |
| Read Associativity | Since: base-4.6.0.0 |
Определено в 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 |
Определено в GHC.IO.Handle.Types МетодыreadsPrec :: Int -> ReadS NewlineMode Source readList :: ReadS [NewlineMode] Source | |
| Read ПереносСтроки | С момента: base-4.3.0.0 |
Определено в GHC.IO.Handle.Types МетодыreadsPrec :: Int -> ReadS ПереносСтроки Исходный код readList :: ReadS [ПереносСтроки] Исходный код | |
| Read РежимБуфера | С момента: base-4.2.0.0 |
Определено в GHC.IO.Handle.Types МетодыreadsPrec :: Int -> ReadS РежимБуфера Исходный код readList :: ReadS [РежимБуфера] Исходный код | |
| Read КодВыхода | |
Определено в GHC.IO.Exception МетодыreadsPrec :: Int -> ReadS КодВыхода Исходный код readList :: ReadS [КодВыхода] Исходный код | |
| Read ДескрипторФайла | |
Определено в System.Posix.Types | |
| Read CNfds | |
Определено в System.Posix.Types МетодыreadsPrec :: Int -> ReadS CNfds Исходный код readList :: ReadS [CNfds] Исходный код | |
| Read CSocklen | |
Определено в System.Posix.Types МетодыreadsPrec :: Int -> ReadS CSocklen Исходный код readList :: ReadS [CSocklen] Исходный код | |
| Read CIno | |
Определено в 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 Подробности сборки мусора | С момента: base-4.10.0.0 |
Определено в GHC.Stats | |
| Read Статистика RTS | С момента: base-4.10.0.0 |
Определено в GHC.Stats | |
| Read a => Read (Down a) |
Этот экземпляр был бы эквивалентен производным экземплярам нового типа С версии: base-4.7.0.0 |
| Read a => Read (Product a) | С версии: base-2.1 |
| Read a => Read (Sum a) | С версии: base-2.1 |
| Read a => Read (Dual a) | С версии: base-2.1 |
| Read a => Read (Last a) | С версии: base-2.1 |
| Read a => Read (First a) | С версии: base-2.1 |
Определено в GHC.Generics МетодыreadsPrec :: Int -> ReadS (M1 i c f p) Исходный код readList :: ReadS [M1 i c f p] Исходный код readPrec :: ReadPrec (M1 i c f p) Исходный код readListPrec :: ReadPrec [M1 i c f p] Исходный код | |
| Read (f (g p)) => Read ((f :.: g) p) | С момента: base-4.7.0.0 |
Определено в 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 |
| (Read a, Read b, Read c, Read d, Read e, Read f, Read g) => Read (a, b, c, d, e, f, g) | Since: base-2.1 |
| (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) | Since: 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 |
Определено в 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 (a, b, c, d, e, f, g, h, i, j, k) | 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 l, Read m) => Read (a, b, c, d, e, f, g, h, i, j, k, l, m) | Since: base-2.1 |
Defined in 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 n) => Read (a, b, c, d, e, f, g, h, i, j, k, l, m, n) | Since: base-2.1 |
Defined in GHC.Read МетодыreadsPrec :: Int -> ReadS (a, b, c, d, e, f, g, h, i, j, k, l, m, n) Source readList :: ReadS [(a, b, c, d, e, f, g, h, i, j, k, l, m, n)] Source readPrec :: ReadPrec (a, b, c, d, e, f, g, h, i, j, k, l, m, n) Source readListPrec :: ReadPrec [(a, b, c, d, e, f, g, h, i, j, k, l, m, n)] Source | |
| (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) | Since: base-2.1 |
Defined in GHC.Read МетодыreadsPrec :: Int -> ReadS (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o) Source readList :: ReadS [(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o)] Source readPrec :: ReadPrec (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o) Source readListPrec :: ReadPrec [(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o)] Source | |
type ReadS a = String -> [(a, String)] Source
Парсер для типа a, представленный как функция, которая принимает String и возвращает список возможных разборов в виде пар (a,String).
Обратите внимание, что этот тип парсера с возвратом назад очень неэффективен; чтение большой структуры может быть довольно медленным (см. ReadP).
Функции Haskell 2010
reads :: Read a => ReadS a Source
эквивалентно readsPrec с приоритетом 0.
read :: Read a => String -> a Source
Функция read считывает входные данные из строки, которая должна быть полностью использована процессом ввода. read завершается с ошибкой error, если разбор не удался, поэтому его использование в реальных приложениях не рекомендуется. Используйте readMaybe или readEither в качестве безопасных альтернатив.
>>> read "123" :: Int 123
>>> read "hello" :: Int *** Exception: Prelude.read: no parse
readParen :: Bool -> ReadS a -> ReadS a Source
readParen True p разбирает то, что разбирает p, но заключенное в скобки.
readParen False p парсит то, что парсит p, но необязательно заключённое в скобки.
lex :: ReadS Строка Исходный код
Функция lex считывает один лексем из входных данных, отбрасывает начальные пробелы и возвращает символы, составляющие лексем. Если входная строка содержит только пробелы, то lex возвращает один успешный `лексем`, состоящий из пустой строки. (Таким образом lex "" = [("","")].) Если в начале входной строки нет законного лексема, то lex терпит неудачу (т.е. возвращает []).
Этот лексический анализатор не полностью соответствует синтаксису Haskell в следующих аспектах:
- Квалифицированные имена не обрабатываются должным образом
- Восьмеричные и шестнадцатеричные числа не распознаются как один токен
- Комментарии не обрабатываются должным образом
Новые функции разбора
module Text.ParserCombinators.ReadPrec
data Лексема Исходный код
Конструкторы
| Символ Символ | Символьный литерал |
| Строка Строка | Строковый литерал, с интерпретацией экранирования |
| Пункт Строка | Пунктуация или зарезервированный символ, например |
| Идентификатор Строка | Идентификатор Haskell, например |
| Символ Строка | Символ Haskell, например |
| Число Число | С версии: base-4.6.0.0 |
| КОНЕЦ_ФАЙЛА |
Примеры
| Eq Лексема | С версии: base-2.1 |
Определено в Text.Read.Lex Методыравно :: Лексема -> Лексема -> Булево Исходный код не равно :: Лексема -> Лексема -> Булево Исходный код | |
| Read Лексема | С версии: base-2.1 |
Определено в GHC.Read МетодыreadsPrec :: Целое -> ReadS Лексема Исходный код readList :: ReadS [Лексема] Исходный код | |
| Show Лексема | С версии: base-2.1 |
Определено в Text.Read.Lex МетодыshowsPrec :: Целое -> Лексема -> ShowS Исходный код отображение :: Лексема -> Строка Исходный код отображение_списка :: [Лексема] -> ShowS Исходный код | |
lexP :: ReadPrec Лексема Исходный код
Разбор одного лексема
скобки :: ReadPrec a -> ReadPrec a Исходный код
(parens p) парсит "P", "(P0)", "((P0))", и т.д., где p парсит "P" в текущем контексте приоритета и парсит "P0" в контексте приоритета ноль
readListDefault :: Read a => ReadS [a] Исходный код
Возможная замена определения метода readList (только GHC). Это необходимо только для GHC, и даже тогда только для Read случаев, где readListPrec не определено как readListPrecDefault.
readListPrecDefault :: Read a => ReadPrec [a] Исходный код
Возможная замена определения метода readListPrec, определённого с использованием readPrec (только GHC).
readEither :: Read a => Строка -> Either Строка a Исходный код
Разбор строки с помощью примера Read. Успешно, если существует ровно один допустимый результат. Значение Left указывает на ошибку разбора.
>>> readEither "123" :: Either String Int Right 123
>>> readEither "hello" :: Either String Int Left "Prelude.read: no parse"
С версии: base-4.6.0.0
readMaybe :: Read a => Строка -> Может a Исходный код
Разбор строки с помощью примера Read. Успешно, если существует ровно один допустимый результат.
>>> readMaybe "123" :: Maybe Int Just 123
>>> readMaybe "hello" :: Maybe Int Nothing
С версии: base-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/8.10.2/docs/html/libraries/base-4.14.1.0/Text-Read.html