Spec-Zone.ru › Haskell 7

Text.Read

Авторские права (c) Университет Глазго 2001
Лицензия BSD-стиль (см. файл libraries/base/LICENSE)
Поддержка libraries@haskell.org
Устойчивость временная
Переносимость непереносимо (использует Text.ParserCombinators.ReadP)
Safe Haskell Надёжный
Язык Haskell2010

Содержание

  • Класс Read
  • Функции Haskell 2010
  • Новые функции парсинга

Описание

Преобразование строк в значения.

Библиотека 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

Минимальное полное определение

readsPrec | readPrec

Методы

readsPrec Исходный код

Аргументы

:: Int

приоритет оператора окружающего контекста (число от 0 до 11). Приоритет применения функции — 10.

-> ReadS a

пытается разобрать значение из начала строки, возвращая список пар (разборённое значение, оставшаяся строка). Если разбор не удался, возвращаемый список пустой.

Производные экземпляры Read и Show удовлетворяют следующим условиям:

  • (x,"") является элементом (readsPrec d (showsPrec d x "")).

То есть, 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
Read Char
Read Double
Read Float
Read Int
Read Int8
Read Int16
Read Int32
Read Int64
Read Integer
Read Ordering
Read Word
Read Word8
Read Word16
Read Word32
Read Word64
Read ()
Read Lexeme
Read GeneralCategory
Read Ассоциативность
Read Фиксированность
Read Арность
Read Любой
Read Все
Read CUIntMax
Read CIntMax
Read CUIntPtr
Read CIntPtr
Read CSUSeconds
Read CUSeconds
Read CTime
Read CClock
Read CSigAtomic
Read CWchar
Read CSize
Read CPtrdiff
Read CDouble
Read CFloat
Read CULLong
Read CLLong
Read CULong
Read CLong
Read CUInt
Read CInt
Read CUShort
Read CShort
Read CUChar
Read CSChar
Read CChar
Read IntPtr
Read WordPtr
Read РежимПоиска
Read РежимПереводСтроки
Read ПереводСтроки
Read РежимБуфера
Read КодВыхода
Read Fd
Read CRLim
Read CTcflag
Read CSpeed
Read CCc
Read CUid
Read CNlink
Read CGid
Read CSsize
Read CPid
Read COff
Read CMode
Read CIno
Read CDev
Read РежимВводаВывода
Read GCStats
Read Версия
Read НатуральноеЧисло
Read НекоторыеСимволы
Read НекоторыеНатуральные
Read Пустое

Чтение Void значения всегда является ошибкой разбора, рассматривая Void как тип данных без конструкторов.

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)

Этот экземпляр был бы эквивалентен выведенным экземплярам нового типа Identity если бы поле runIdentity было удалено

(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)
(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)

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 :: ReadS String Source

Функция lex считывает один лексем из входных данных, отбрасывает начальные пробелы и возвращает символы, составляющие лексем. Если строка ввода содержит только пробелы, lex возвращает один успешный `лексем`, состоящий из пустой строки. (Таким образом, lex "" = [("","")].) Если в начале строки ввода нет допустимого лексема, lex завершается неудачей (т. е. возвращает []).

Этот лексический анализатор не полностью соответствует синтаксису Haskell в следующих аспектах:

  • Квалифицированные имена не обрабатываются должным образом
  • Восьмеричные и шестнадцатеричные числовые значения не распознаются как один токен
  • Комментарии не обрабатываются должным образом

Новые функции разбора

module Text.ParserCombinators.ReadPrec

data Lexeme Source

Конструкторы

Char Char

Лексема-символ

String String

Лексема-строка, со с интерпретацией экранирований

Punc String

Пунктуация или зарезервированный символ, например, (, ::

Ident String

Идентификатор Haskell, например, foo, Baz

Symbol String

Символ Haskell, например, >>, :%

Number Number

С версии: 4.6.0.0

EOF

Примеры использования

Eq Lexeme
Read Lexeme
Show Lexeme

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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API