Text.Read
| Авторские права | (c) The University of Glasgow, 2001 |
|---|---|
| Лицензия | в стиле BSD (см. файл libraries/base/LICENSE) |
| Сопровождающий | libraries@haskell.org |
| Стабильность | предварительная |
| Переносимость | непереносимый (использует Text.ParserCombinators.ReadP) |
| Безопасный Haskell | безопасный |
| Язык | Haskell2010 |
Содержание
Описание
Преобразование строк в значения.
Модуль Text.Read — основное место для импорта средств класса Read. Только для GHC он предоставляет расширенный и значительно улучшенный класс Read, который представляет собой предлагаемую альтернативу Read из Haskell 2010. В частности, писать парсеры проще, а сами парсеры работают намного эффективнее.
Класс 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 CIntPtr Источник | |
| Read CLLong Источник | |
| Read CLong Источник | |
| Read CPtrdiff Источник | |
| Read CSChar Источник | |
| Read CSUSeconds Источник | |
Определено в GHC.Internal.Foreign.C.Types МетодыreadsPrec :: Int -> ReadS CSUSeconds Источник readList :: ReadS [CSUSeconds] Источник | |
| Read CShort Источник | |
| Read CSigAtomic Источник | |
Определено в GHC.Internal.Foreign.C.Types МетодыreadsPrec :: Int -> ReadS CSigAtomic Источник readList :: ReadS [CSigAtomic] Источник | |
| Read CSize Источник | |
| Read CTime Источник | |
| Read CUChar Источник | |
| Read CUInt Источник | |
| Read CUIntMax Источник | |
| Read CUIntPtr Источник | |
| Read CULLong Источник | |
| Read CULong Источник | |
| Read CUSeconds Источник | |
| Read CUShort Источник | |
| Read CWchar Источник | |
| Read IntPtr Источник | |
| Read WordPtr Источник | |
| Read Associativity Источник | Начиная с: base-4.6.0.0 |
Определено в GHC.Internal.Generics МетодыreadsPrec :: Int -> ReadS Associativity Источник readList :: ReadS [Associativity] Источник | |
| Read DecidedStrictness Источник | Начиная с: base-4.9.0.0 |
Определено в GHC.Internal.Generics МетодыreadsPrec :: Int -> ReadS DecidedStrictness Источник readList :: ReadS [DecidedStrictness] Источник | |
| Read Fixity Источник | Начиная с: base-4.6.0.0 |
| Read SourceStrictness Источник | Начиная с: base-4.9.0.0 |
Определено в GHC.Internal.Generics МетодыreadsPrec :: Int -> ReadS SourceStrictness Источник readList :: ReadS [SourceStrictness] Источник | |
| Read SourceUnpackedness Источник | Начиная с: base-4.9.0.0 |
Определено в GHC.Internal.Generics | |
| Read SeekMode Источник | Начиная с: base-4.2.0.0 |
| Read ExitCode Источник | |
| Read BufferMode Источник | Начиная с: base-4.2.0.0 |
Определено в GHC.Internal.IO.Handle.Types МетодыreadsPrec :: Int -> ReadS BufferMode Источник readList :: ReadS [BufferMode] Источник | |
| Read Newline Источник | Начиная с: base-4.3.0.0 |
| Read NewlineMode Источник | Начиная с: base-4.3.0.0 |
Определено в GHC.Internal.IO.Handle.Types МетодыreadsPrec :: Int -> ReadS NewlineMode Источник readList :: ReadS [NewlineMode] Источник | |
| Read IOMode Источник | Начиная с: base-4.2.0.0 |
| Read Int16 Источник | Начиная с: base-2.1 |
| Read Int32 Источник | Начиная с: base-2.1 |
| Read Int64 Источник | Начиная с: base-2.1 |
| Read Int8 Источник | Начиная с: base-2.1 |
| Read GCDetails Источник | Начиная с: base-4.10.0.0 |
| Read RTSStats Источник | Начиная с: base-4.10.0.0 |
| Read CBlkCnt Источник | |
| Read CBlkSize Источник | |
| Read SomeSymbol Источник | Начиная с: base-4.7.0.0 |
Определено в GHC.Internal.TypeLits МетодыreadsPrec :: Int -> ReadS SomeSymbol Источник readList :: ReadS [SomeSymbol] Источник | |
| Read SomeNat Источник | Начиная с: base-4.7.0.0 |
| Read Ordering Источник | Начиная с: base-2.1 |
| Read GeneralCategory Источник | Начиная с: base-2.1 |
Определено в GHC.Internal.Read МетодыreadsPrec :: Int -> ReadS GeneralCategory Источник readList :: ReadS [GeneralCategory] Источник | |
| Read Word16 Источник | Начиная с: base-2.1 |
| Read Word32 Источник | Начиная с: base-2.1 |
| Read Word64 Источник | Начиная с: base-2.1 |
| Read Word8 Источник | Начиная с: base-2.1 |
| Read Integer Источник | Начиная с: base-2.1 |
| Read Natural Источник | Начиная с: base-4.8.0.0 |
| Read () Источник | Начиная с: base-2.1 |
| Read Bool Источник | Начиная с: base-2.1 |
| Read Char Источник | Начиная с: base-2.1 |
| Read Double Источник | Начиная с: base-2.1 |
| Read Float Источник | С версии: base-2.1 |
| Read Int Источник | С версии: base-2.1 |
| Read Word Источник | С версии: base-4.5.0.0 |
| Read a => Read (Complex a) Источник | С версии: base-2.1 |
| Read a => Read (First a) Источник | С версии: base-4.9.0.0 |
| Read a => Read (Last a) Источник | С версии: base-4.9.0.0 |
| Read a => Read (Max a) Источник | С версии: base-4.9.0.0 |
| Read a => Read (Min a) Источник | С версии: base-4.9.0.0 |
| Read m => Read (WrappedMonoid m) Источник | С версии: base-4.9.0.0 |
Определено в Data.Semigroup МетодыreadsPrec :: Int -> ReadS (WrappedMonoid m) Источник readList :: ReadS [WrappedMonoid m] Источник readPrec :: ReadPrec (WrappedMonoid m) Источник | |
| Read a => Read (NonEmpty a) Источник | С версии: base-4.11.0.0 |
| Read a => Read (And a) Источник | С версии: base-4.16 |
| Read a => Read (Iff a) Источник | С версии: base-4.16 |
| Read a => Read (Ior a) Источник | С версии: base-4.16 |
| Read a => Read (Xor a) Источник | С версии: base-4.16 |
| Read a => Read (Identity a) Источник |
Этот экземпляр был бы эквивалентен выведенным экземплярам newtype Начиная с: base-4.8.0.0 |
| Read a => Read (First a) Источник | Начиная с: base-2.1 |
| Read a => Read (Last a) Источник | Начиная с: base-2.1 |
| Read a => Read (Down a) Источник |
Этот экземпляр был бы эквивалентен выведенным экземплярам newtype Начиная с: base-4.7.0.0 |
| Read a => Read (Dual a) Источник | Начиная с: base-2.1 |
| Read a => Read (Product a) Источник | Начиная с: base-2.1 |
| Read a => Read (Sum a) Источник | Начиная с: base-2.1 |
| Read a => Read (ZipList a) Источник | Начиная с: base-4.7.0.0 |
| Read p => Read (Par1 p) Источник | Начиная с: base-4.7.0.0 |
| (Integral a, Read a) => Read (Ratio a) Источник | Начиная с: base-2.1 |
| Read a => Read (Maybe a) Источник | Начиная с: base-2.1 |
| Read a => Read (Solo a) Источник | Начиная с: base-4.15 |
| Read a => Read [a] Источник | Начиная с: base-2.1 |
| Read (f p) => Read (Rec1 f p) Источник | С версии: base-4.7.0.0 |
| (Read a, Read b, Read c) => Read (a, b, c) Источник | С версии: base-2.1 |
| (Read (f a), Read (g a)) => Read (Product f g a) Источник | С версии: base-4.18.0.0 |
| (Read (f a), Read (g a)) => Read (Sum f g a) Источник | С версии: base-4.18.0.0 |
| a ~~ b => Read (a :~~: b) Источник | С версии: base-4.10.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 c => Read (K1 i c p) Источник | С версии: base-4.7.0.0 |
| (Read a, Read b, Read c, Read d) => Read (a, b, c, d) Источник | С версии: base-2.1 |
| Read (f (g a)) => Read (Compose f g a) Источник | С версии: base-4.18.0.0 |
| Read (f (g p)) => Read ((f :.: g) p) Источник | С версии: base-4.7.0.0 |
| Read (f p) => Read (M1 i c f p) Источник | С версии: base-4.7.0.0 |
| (Read a, Read b, Read c, Read d, Read e) => Read (a, b, c, d, e) Источник | С версии: base-2.1 |
| (Read a, Read b, Read c, Read d, Read e, Read f) => Read (a, b, c, d, e, f) Источник | Начиная с: 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) Источник | Начиная с: 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) Источник | Начиная с: 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) Источник | Начиная с: 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) Источник | Начиная с: 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) Источник | Начиная с: base-2.1 |
Определён в GHC.Internal.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) Источник | Начиная с: base-2.1 |
Определён в GHC.Internal.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) Источник | Начиная с: base-2.1 |
Определён в GHC.Internal.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) Источник | Начиная с: base-2.1 |
Определён в GHC.Internal.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.Internal.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).
Функции Haskell 2010
reads :: Read a => ReadS a Исходный код
эквивалентна readsPrec с приоритетом 0.
read :: Read a => String -> a Исходный код
Функция read считывает данные из строки, которая должна быть полностью обработана в процессе ввода. read завершается с ошибкой error, если разбор не удался, поэтому её не рекомендуется использовать в реальных приложениях. Для безопасных альтернатив используйте readMaybe или readEither.
>>> read "123" :: Int 123
>>> read "hello" :: Int *** Exception: Prelude.read: no parse
readParen :: Bool -> ReadS a -> ReadS a Исходный код
readParen True p разбирает то же, что и p, но заключённое в скобки.
readParen False p разбирает то же, что и p, но скобки могут присутствовать или отсутствовать.
lex :: ReadS String Исходный код
Функция lex считывает из входных данных одну лексему, удаляя начальные пробельные символы и возвращая символы, составляющие эту лексему. Если входная строка содержит только пробельные символы, lex возвращает единственную успешно разобранную «lexeme», состоящую из пустой строки. (Таким образом, lex "" = [("","")].) Если в начале входной строки нет допустимой лексемы, lex завершается неудачей (то есть возвращает []).
Этот лексический анализатор не полностью соответствует лексическому синтаксису Haskell в следующих отношениях:
- Квалифицированные имена обрабатываются неправильно
- Восьмеричные и шестнадцатеричные числа не распознаются как единый токен
- Комментарии обрабатываются неправильно
Новые функции разбора
module Text.ParserCombinators.ReadPrec
data Lexeme Исходный код
Конструкторы
| Char Char | Литерал символа |
| String String | Строковый литерал с обработанными escape-последовательностями |
| Punc String | Знак пунктуации или зарезервированный символ, например |
| Ident String | Идентификатор Haskell, например |
| Symbol String | Символ Haskell, например |
| Number Number | Начиная с: base-4.6.0.0 |
| EOF |
Экземпляры
| Eq Lexeme Исходный код | Начиная с: base-2.1 |
Определён в GHC.Internal.Text.Read.Lex | |
| Read Lexeme Исходный код | Начиная с: base-2.1 |
Определён в GHC.Internal.Read МетодыreadsPrec :: Int -> ReadS Lexeme Исходный код readList :: ReadS [Lexeme] Исходный код | |
| Show Lexeme Исходный код | Начиная с: base-2.1 |
Определён в GHC.Internal.Text.Read.Lex МетодыshowsPrec :: Int -> Lexeme -> ShowS Исходный код show :: Lexeme -> String Исходный код showList :: [Lexeme] -> ShowS Исходный код | |
lexP :: ReadPrec Lexeme Исходный код
Разобрать одну лексему
parens :: ReadPrec a -> ReadPrec a Исходный код
(parens p) разбирает "P", "(P0)", "((P0))" и т. д., где p разбирает "P" в контексте текущего приоритета, а "P0" — в контексте приоритета 0
readListDefault :: Read a => ReadS [a] Исходный код
Возможный вариант реализации метода readList (только GHC). Он нужен только для GHC и даже там лишь для экземпляров Read, в которых readListPrec не определён как readListPrecDefault.
readListPrecDefault :: Read a => ReadPrec [a] Исходный код
Возможный вариант реализации метода readListPrec, определённый с помощью readPrec (только GHC).
readEither :: Read a => String -> Either String 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 => String -> Maybe 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/9.14.1/docs/libraries/base-4.22.0.0-66f8/Text-Read.html