Spec-Zone.ru › Haskell 7

Language.Haskell.TH.Syntax

Copyright (c) The University of Glasgow 2003
License BSD-style (see the file libraries/base/LICENSE)
Maintainer libraries@haskell.org
Stability experimental
Portability portable
Safe Haskell None
Language Haskell2010

Описание

Определения абстрактного синтаксиса для Template Haskell.

class Monad m => Quasi m where Source

Методы

qNewName Source

Аргументы

:: String
-> m Name

Новые имена

qReport Source

Аргументы

:: Bool
-> String
-> m ()

Сообщить об ошибке (True) или предупреждении (False) ...но продолжить; использовать fail для остановки

qRecover Source

Аргументы

:: m a

обработчик ошибок

-> m a

действие, которое может завершиться неудачей

-> m a

Восстановление из монадического fail

qLookupName :: Bool -> String -> m (Maybe Name) Source

qReify :: Name -> m Info Source

qReifyInstances :: Name -> [Type] -> m [Dec] Source

qReifyRoles :: Name -> m [Role] Source

qReifyAnnotations :: Data a => AnnLookup -> m [a] Source

qReifyModule :: Module -> m ModuleInfo Source

qLocation :: m Loc Source

qRunIO :: IO a -> m a Source

Ввод/вывод (опасно)

qAddDependentFile :: FilePath -> m () Source

qAddTopDecls :: [Dec] -> m () Source

qAddModFinalizer :: Q () -> m () Source

qGetQ :: Typeable a => m (Maybe a) Source

qPutQ :: Typeable a => a -> m () Source

Экземпляры

Quasi IO
Quasi Q

badIO :: String -> IO a Source

counter :: IORef Int Source

newtype Q a Source

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

Q

Поля

unQ :: forall m. Quasi m => m a

Экземпляры

Monad Q
Functor Q
Applicative Q
Quasi Q

runQ :: Quasi m => Q a -> m a Source

newtype TExp a Source

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

TExp

Поля

unType :: Exp

unTypeQ :: Q (TExp a) -> Q Exp Source

unsafeTExpCoerce :: Q Exp -> Q (TExp a) Source

newName :: String -> Q Name Source

Сгенерировать новое имя, которое не может быть захвачено.

Например, это:

f = $(do
  nm1 <- newName "x"
  let nm2 = mkName "x"
  return (LamE [VarP nm1] (LamE [VarP nm2] (VarE nm1)))
 )

выведет сплейс

f = \x0 -> \x -> x0

В частности, вхождение VarE nm1 относится к связыванию VarP nm1, и не захватывается связыванием VarP nm2.

Хотя имена, сгенерированные newName не могут быть захвачены, они могут захватывать другие имена. Например, это:

g = $(do
  nm1 <- newName "x"
  let nm2 = mkName "x"
  return (LamE [VarP nm2] (LamE [VarP nm1] (VarE nm2)))
 )

выведет сплейс

g = \x -> \x0 -> x0

поскольку вхождение VarE nm2 захватывается внутренним связыванием x, а именно VarP nm1.

report :: Bool -> String -> Q () Source

Устарело: Используйте reportError или reportWarning вместо этого

Сообщить об ошибке (True) или предупреждении (False), но продолжить; используйте fail для остановки.

reportError :: String -> Q () Source

Сообщить пользователю об ошибке, но позволить текущему вычислению сплейса продолжиться. Для прерывания вычисления используйте fail.

reportWarning :: String -> Q () Source

Сообщить пользователю о предупреждении и продолжить.

recover Source

Аргументы

:: Q a

обработчик для вызова при ошибке

-> Q a

вычисление для выполнения

-> Q a

Восстановление после ошибок, поднятых reportError или fail.

lookupName :: Bool -> String -> Q (Maybe Name) Source

lookupTypeName :: String -> Q (Maybe Name) Source

Поиск заданного имени в (пространстве имен типов) области видимости текущего сплейса. Для получения более подробной информации см. Language.Haskell.TH.Syntax.

lookupValueName :: String -> Q (Maybe Name) Source

Поиск заданного имени в (пространстве имен значений) области видимости текущего сплейса. Для получения более подробной информации см. Language.Haskell.TH.Syntax.

Функции lookupTypeName и lookupValueName предоставляют способ запросить контекст текущего сплейса для определения имен, находящихся в области видимости. Функция lookupTypeName запрашивает пространство имен типов, а lookupValueName запрашивает пространство имен значений, но функции в остальном идентичны.

Вызов lookupValueName s проверит, существует ли значение с именем s в области видимости в текущей позиции сплейса. Если существует, то Name этого значения возвращается; если нет, то возвращается Nothing.

Возвращаемое имя не может быть "захвачено". Например:

f = "global"
g = $( do
         Just nm <- lookupValueName "f"
         [| let f = "local" in $( varE nm ) |]

В этом случае g = "global"; вызов lookupValueName вернул глобальное f, и это имя не было захвачено локальным определением f.

Поиск выполняется в контексте главного сплейса, который выполняется. Например:

f = "global"
g = $( [| let f = "local" in
           $(do
               Just nm <- lookupValueName "f"
               varE nm
            ) |] )

Опять же в этом примере g = "global", поскольку вызов lookupValueName запрашивает контекст самого внешнего $(...).

Операторы должны быть запрошены без каких-либо окружающих скобок, например:

lookupValueName "+"

Также поддерживаются квалифицированные имена, например:

lookupValueName "Prelude.+"
lookupValueName "Prelude.map"

reify :: Name -> Q Info Source

reify получает информацию о Name.

Иногда полезно построить имя аргумента, используя lookupTypeName или lookupValueName для обеспечения того, что мы выполняем реификацию из правильного пространства имен. Например, в этом контексте:

data D = D

Что D делает reify (mkName "D") возвращать информацию о? (Ответ: D-тип, но не полагайтесь на это.) Чтобы получить информацию о D-значение, используйте lookupValueName:

do
  Just nm <- lookupValueName "D"
  reify nm

и чтобы получить информацию о D-тип, используйте lookupTypeName.

reifyInstances :: Name -> [Type] -> Q [InstanceDec] Source

reifyInstances nm tys возвращает список видимых экземпляров nm tys. То есть, если nm является именем типа класса, то все экземпляры этого класса в типах tys возвращаются. В противном случае, если nm является именем семейства данных или семейства типов, все экземпляры этого семейства в типах tys возвращаются.

reifyRoles :: Name -> Q [Role] Source

reifyRoles nm возвращает список ролей, связанных с параметрами тиконструктора nm. Возвращает ошибку, если nm не может быть найден или не является тиконструктором. Возвращаемый список никогда не должен содержать InferR.

reifyAnnotations :: Data a => AnnLookup -> Q [a] Source

reifyAnnotations target возвращает список аннотаций, связанных с target. Возвращаются только соответствующие типы аннотаций. Если у вас есть аннотации Int и String для одной и той же цели, вам нужно вызвать эту функцию дважды.

reifyModule :: Module -> Q ModuleInfo Source

reifyModule mod получает информацию о модуле mod. Чтобы получить информацию о текущем модуле, вызовите эту функцию со значением, возвращаемым thisModule.

isInstance :: Name -> [Type] -> Q Bool Source

Список экземпляров, возвращаемый reifyInstances не пуст?

location :: Q Loc Source

Расположение, в котором выполняется это вычисление.

runIO :: IO a -> Q a Source

Функция runIO позволяет выполнить вычисление I/O в монаде Q. Обратите внимание: порядок вызовов runIO в рамках одного вычисления Q гарантирован, но не порядок выполнения сплейсов.

Примечание: по различным причинам, обработчики stdout и stderr не обязательно сбрасываются, когда компилятор завершает работу, поэтому вам следует сбросить их самостоятельно.

addDependentFile :: FilePath -> Q () Source

Записывает внешние файлы, используемые runIO (зависимости). Затем компилятор может распознать, что ему необходимо перекомпилировать файл Haskell, когда изменяется внешний файл.

Ожидается абсолютный путь к файлу.

Примечания:

  • ghc -M не знает об этих зависимостях - он не выполняет TH.
  • Зависимость основана на содержимом файла, а не на времени последнего изменения.

addTopDecls :: [Dec] -> Q () Source

Добавляет дополнительные объявления верхнего уровня. Добавленные объявления будут проверены на тип вместе с текущей группой объявлений.

addModFinalizer :: Q () -> Q () Source

Добавляет финализатор, который будет выполняться в монаде Q после проверки типа текущего модуля. Это имеет смысл только при выполнении внутри сплейса верхнего уровня.

getQ :: Typeable a => Q (Maybe a) Source

Получение состояния из монады Q.

putQ :: Typeable a => a -> Q () Source

Замена состояния в монаде Q.

returnQ :: a -> Q a Source

bindQ :: Q a -> (a -> Q b) -> Q b Source

sequenceQ :: [Q a] -> Q [a] Source

class Lift t where Source

Методы

lift :: t -> Q Exp Source

Экземпляры

Lift Bool
Lift Char
Lift Double
Lift Float
Lift Int
Lift Int8
Lift Int16
Lift Int32
Lift Int64
Lift Integer
Lift Word
Lift Word8
Lift Word16
Lift Word32
Lift Word64
Lift ()
Lift Natural
Lift a => Lift [a]
Integral a => Lift (Ratio a)
Lift a => Lift (Maybe a)
(Lift a, Lift b) => Lift (Either a b)
(Lift a, Lift b) => Lift (a, b)
(Lift a, Lift b, Lift c) => Lift (a, b, c)
(Lift a, Lift b, Lift c, Lift d) => Lift (a, b, c, d)
(Lift a, Lift b, Lift c, Lift d, Lift e) => Lift (a, b, c, d, e)
(Lift a, Lift b, Lift c, Lift d, Lift e, Lift f) => Lift (a, b, c, d, e, f)
(Lift a, Lift b, Lift c, Lift d, Lift e, Lift f, Lift g) => Lift (a, b, c, d, e, f, g)

liftString :: String -> Q Exp Source

trueName :: Name Source

falseName :: Name Source

nothingName :: Name Source

justName :: Name Source

leftName :: Name Source

rightName :: Name Source

newtype ModName Source

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

ModName String

Экземпляры

Eq ModName
Data ModName
Ord ModName
Show ModName
Generic ModName
type Rep ModName

newtype PkgName Source

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

PkgName String

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

Eq PkgName
Data PkgName
Ord PkgName
Show PkgName
Generic PkgName
type Rep PkgName

data Модуль Источник

Получено из reifyModule и thisModule.

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

Модуль PkgName ModName

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

Eq Модуль
Data Модуль
Ord Модуль
Show Модуль
Generic Модуль
Ppr Модуль
type Rep Модуль

newtype Имя_переменной Источник

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

Имя_переменной Строка

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

Eq Имя_переменной
Data Имя_переменной
Ord Имя_переменной
Show Имя_переменной
Generic Имя_переменной
type Rep Имя_переменной

mkModName :: Строка -> ModName Источник

modString :: ModName -> Строка Источник

mkPkgName :: Строка -> PkgName Источник

pkgString :: PkgName -> Строка Источник

mkOccName :: Строка -> Имя_переменной Источник

occString :: Имя_переменной -> Строка Источник

Большая часть API Name посвящена проблеме захвата имен, что можно увидеть в следующем примере.

f expr = [| let x = 0 in $expr |]
...
g x = $( f [| x |] )
h y = $( f [| y |] )

Примитивное упрощение этого приведет к:

g x = let x = 0 in x
h y = let x = 0 in y

Внезапно, g и h имеют разные значения! В этом случае мы говорим, что x в правой части g был захвачен связыванием x в f.

На самом деле нам нужно, чтобы x в f отличалось от x в g, поэтому мы получаем следующее упрощение:

g x = let x' = 0 in x
h y = let x' = 0 in y

что избегает захвата имен, как и ожидалось.

В общем случае, мы говорим, что Name может быть захвачено, если то, на что оно ссылается, может быть изменено путем добавления новых объявлений.

data Имя Источник

Абстрактный тип, представляющий имена в дереве синтаксического анализа.

Name могут быть построены различными способами, что влечёт за собой разные гарантии предотвращения захвата имени (см. Language.Haskell.TH.Syntax для объяснения захвата имени):

  • встроенный синтаксис 'f и ''T могут быть использованы для построения имён. Выражение 'f даёт Name, которое ссылается на значение f, в настоящее время находящееся в области видимости, а ''T даёт Name, которое ссылается на тип T, в настоящее время находящийся в области видимости. Эти имена никогда не могут быть захвачены.
  • lookupValueName и lookupTypeName похожи на 'f и ''T соответственно, но Name ищутся в момент выполнения текущей вставки. Эти имена никогда не могут быть захвачены.
  • newName монадного типа генерирует новое имя, которое никогда не может быть захвачено.
  • mkName генерирует имя, которое может быть захвачено.

Имена, построенные с использованием newName и mkName могут использоваться в связываниях (например, let x = ... или x -> ...), но имена, построенные с использованием lookupValueName, lookupTypeName, 'f, ''T, не могут.

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

Имя Имя_переменной Тип_имени

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

Eq Имя
Data Имя
Ord Имя
Show Имя
Generic Имя
Ppr Имя
type Rep Имя

data NameFlavour Source

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

NameS

Имя без квалификатора; динамически связанное

NameQ ModName

Квалифицированное имя; динамически связанное

NameU !Int

Уникальное локальное имя

NameL !Int

Локальное имя, связанное вне AST TH

NameG NameSpace PkgName ModName

Глобальное имя, связанное вне AST TH: Исходное имя (только вхождения, а не связующие элементы). Требуется также имя пространства, чтобы быть уверенным, что мы имеем в виду именно это.

Реализации

Eq NameFlavour
Data NameFlavour
Ord NameFlavour
Generic NameFlavour
type Rep NameFlavour

data NameSpace Source

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

VarName

Переменные

DataName

Конструкторы данных

TcClsName

Конструкторы типов и классы; в Haskell они пока находятся в одном пространстве имён.

Реализации

Eq NameSpace
Data NameSpace
Ord NameSpace
Generic NameSpace
type Rep NameSpace

type Uniq = Int Source

nameBase :: Name -> String Source

Имя без префикса модуля

nameModule :: Name -> Maybe String Source

Префикс модуля имени, если он существует

mkName :: String -> Name Source

Создаёт имя, которое можно захватить. Вхождения таких имён будут разрешаться в соответствии с правилами области видимости Haskell в месте использования.

Например:

f = [| pi + $(varE (mkName "pi")) |]
...
g = let pi = 3 in $f

В этом случае g упрощается до

g = Prelude.pi + 3

Обратите внимание, что mkName можно использовать с квалифицированными именами:

mkName "Prelude.pi"

См. также dyn для полезного комбинатора. Приведённый выше пример можно переписать, используя dyn как

f = [| pi + $(dyn "pi") |]

mkNameU :: String -> Uniq -> Name Source

Используется только во внутренней работе

mkNameL :: String -> Uniq -> Name Source

Используется только во внутренней работе

mkNameG :: NameSpace -> String -> String -> String -> Name Source

Используется для 'x и т. д., но недоступно программисту

mkNameG_v :: String -> String -> String -> Name Source

mkNameG_tc :: String -> String -> String -> Name Source

mkNameG_d :: String -> String -> String -> Name Source

data NameIs Source

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

Alone
Applied
Infix

showName :: Name -> String Source

showName' :: NameIs -> Name -> String Source

tupleDataName :: Int -> Name Source

Конструктор данных кортежа

tupleTypeName :: Int -> Name Source

Конструктор типа кортежа

mk_tup_name :: Int -> NameSpace -> Name Source

unboxedTupleDataName :: Int -> Name Source

Конструктор данных неупакованной кортежи

unboxedTupleTypeName :: Int -> Name Source

Конструктор типов неупакованной кортежи

mk_unboxed_tup_name :: Int -> NameSpace -> Name Source

data Loc Source

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

Loc

Поля

loc_filename :: String
loc_package :: String
loc_module :: String
loc_start :: CharPos
loc_end :: CharPos

Реализации

Eq Loc
Data Loc
Ord Loc
Show Loc
Generic Loc
Ppr Loc
type Rep Loc

type CharPos Source

Аргументы

= (Int, Int)

Строка и позиция символа

data Info Source

Получено из reify в Q Monad.

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

ClassI Dec [InstanceDec]

Класс с перечнем видимых реализаций

ClassOpI Name Type ParentName Fixity

Метод класса

TyConI Dec

«Простой» конструктор типа. «Более сложные» конструкторы типов возвращаются с использованием PrimTyConI или FamilyI соответственно

FamilyI Dec [InstanceDec]

Семейство типов или данных, с перечнем видимых реализаций. Закрытое семейство типов возвращается с 0 реализациями.

PrimTyConI Name Arity Unlifted

«Примитивный» конструктор типа, который нельзя выразить с помощью Dec. Примеры: (->), Int#.

DataConI Name Type ParentName Fixity

Конструктор данных

VarI Name Type (Maybe Dec) Fixity

Переменная «значения» (в отличие от переменной типа, см. TyVarI).

Поле Maybe Dec содержит Just объявление, которое определило переменную — включая правую часть объявления, или же Nothing, в случае, если правая часть недоступна компилятору. В настоящее время это значение _всегда_ Nothing: возврат правой части ещё не реализован из-за отсутствия интереса.

TyVarI Name Type

Переменная типа.

Поле Type содержит тип, на котором основана переменная. В настоящее время это всегда VarT theName, но в будущих изменениях это может быть уточнено.

Реализации

Eq Info
Data Info
Ord Info
Show Info
Generic Info
Ppr Info
type Rep Info

data ModuleInfo Source

Получено из reifyModule в Q Monad.

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

ModuleInfo [Module]

Содержит список импортов модуля.

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

Eq ModuleInfo
Data ModuleInfo
Ord ModuleInfo
Show ModuleInfo
Generic ModuleInfo
Ppr ModuleInfo
type Rep ModuleInfo

type ИмяРодителя = Имя Источник

В ClassOpI и DataConI, имя родительского класса или типа

type Арность = Целое Источник

В PrimTyConI, арность конструктора типа

type Неподнятый = Булево Источник

В PrimTyConI, является ли конструктор типа неподнятым?

type ДекларацияПримера = Декларация Источник

InstanceDec описывает отдельный пример класса или функции типа. Это просто Dec, но гарантируется, что он будет одним из следующих:

  • InstanceD (с пустым [Dec])
  • DataInstD или NewtypeInstD (с пустым производным [Name])
  • TySynInstD

data Связанность Источник

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

Связанность Целое НаправлениеСвязанности

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

Eq Связанность
Data Связанность
Ord Связанность
Show Связанность
Generic Связанность
type Rep Связанность

data НаправлениеСвязанности Источник

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

Левоассоциативное
Правоассоциативное
Нейтральное

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

Eq НаправлениеСвязанности
Data НаправлениеСвязанности
Ord НаправлениеСвязанности
Show НаправлениеСвязанности
Generic НаправлениеСвязанности
type Rep НаправлениеСвязанности

МаксимальныйПриоритет :: Целое Источник

Наивысший разрешенный приоритет оператора для Fixity конструктора (ответ: 9)

ПоУмолчаниюСвязанность :: Связанность Источник

По умолчанию связанность: infixl 9

При реализации антицитаций для квазицитаторов, часто необходимо анализировать строки в выражения:

parse :: String -> Maybe Exp

Но как следует анализировать a + b * c? Если нам неизвестны связанности + и *, мы не знаем, следует ли анализировать его как a + (b * c) или (a + b) * c.

В таких случаях используйте UInfixE или UInfixP, которые обозначают "нераспределённое инфиксное выражение" и "нераспределённое инфиксное образец". Когда компилятор получает вставку, содержащую дерево приложений UInfixE таких как

UInfixE
  (UInfixE e1 op1 e2)
  op2
  (UInfixE e3 op3 e4)

он будет искать и связанные приоритеты соответствующих операторов и перегруппировывать дерево по мере необходимости.

  • Деревья не будут перегруппированы через ParensE или ParensP, что используется для анализа выражений, таких как
(a + b * c) + d * e
  • InfixE и InfixP выражения никогда не перегруппировываются.
  • Конструктор UInfixE не поддерживает секции. Секции, такие как (a *) не имеют неоднозначности, поэтому InfixE достаточно. Для более длинных секций, таких как (a + b * c -), используйте конструктор InfixE для внешней секции и используйте конструкторы UInfixE для всех остальных операторов:
InfixE
  Just (UInfixE ...a + b * c...)
  op
  Nothing

Секции, такие как (a + b +) и ((a + b) +) должны быть отображены в Exps по-разному:

(+ a + b)   ---> InfixE Nothing + (Just $ UInfixE a + b)
                   -- will result in a fixity error if (+) is left-infix
(+ (a + b)) ---> InfixE Nothing + (Just $ ParensE $ UInfixE a + b)
                   -- no fixity errors
  • Выражения в кавычках, такие как
[| a * b + c |] :: Q Exp
[p| a : b : c |] :: Q Pat

никогда не будут содержать UInfixE, UInfixP, ParensE, или ParensP конструкторы.

data Лит Источник

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

Символ Символ
Строка Строка
ЦелоеЧисло ЦелоеЧисло

Используется для перегруженных и неперегруженных литералов. У нас нет хорошего способа представить неперегруженные литералы в данный момент. Возможно, это не имеет значения?

РациональноеЧисло РациональноеЧисло
ЦелоеПримитив ЦелоеЧисло
СловоПримитив ЦелоеЧисло
ЧислоСПлавающейТочкойПримитив РациональноеЧисло
ДвойноеЧислоСПлавающейТочкойПримитив РациональноеЧисло
СтрокаПримитив [Слово8]

Примитивная строка в стиле C, тип Addr#

Примеры реализации

Eq Lit
Data Lit
Ord Lit
Show Lit
Generic Lit
Ppr Lit
type Rep Lit

data Pat Источник

Шаблон в Haskell, заданный в {}

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

LitP Lit
{ 5 or c }
VarP Имя
{ x }
TupP [Pat]
{ (p1,p2) }
UnboxedTupP [Pat]
{ () }
ConP Имя [Pat]
data T1 = C1 t1 t2; {C1 p1 p1} = e
InfixP Pat Имя Pat
foo ({x :+ y}) = e
UInfixP Pat Имя Pat
foo ({x :+ y}) = e

См. Language.Haskell.TH.Синтаксис

ParensP Pat
{(p)}

См. Language.Haskell.TH.Синтаксис

TildeP Pat
{ ~p }
BangP Pat
{ !p }
AsP Имя Pat
{ x @ p }
WildP
{ _ }
RecP Имя [FieldPat]
f (Pt { pointx = x }) = g x
ListP [Pat]
{ [1,2,3] }
SigP Pat Тип
{ p :: t }
ViewP Exp Pat
{ e -> p }

Примеры реализации

Eq Pat
Data Pat
Ord Pat
Show Pat
Generic Pat
Ppr Pat
type Rep Pat

type FieldPat = (Имя, Pat) Источник

data Сопоставление Источник

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

Сопоставление Pat Тело [Dec]
case e of { pat -> body where decs }

Примеры реализации

Eq Сопоставление
Data Сопоставление
Ord Сопоставление
Show Сопоставление
Generic Сопоставление
Ppr Сопоставление
type Rep Сопоставление

data Условие Источник

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

Условие [Pat] Тело [Dec]
f { p1 p2 = body where decs }

Примеры реализации

Eq Условие
Data Условие
Ord Условие
Show Условие
Generic Условие
Ppr Условие
type Rep Условие

data Выражение Источник

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

VarE Name
{ x }
ConE Name
data T1 = C1 t1 t2; p = {C1} e1 e2
LitE Lit
{ 5 or c}
AppE Exp Exp
{ f x }
InfixE (Maybe Exp) Exp (Maybe Exp)
{x + y} or {(x+)} or {(+ x)} or {(+)}
UInfixE Exp Exp Exp
{x + y}

См. Language.Haskell.TH.Syntax

ParensE Exp
{ (e) }

См. Language.Haskell.TH.Syntax

LamE [Pat] Exp
{  p1 p2 -> e }
LamCaseE [Match]
{ case m1; m2 }
TupE [Exp]
{ (e1,e2) }
UnboxedTupE [Exp]
{ () }
CondE Exp Exp Exp
{ if e1 then e2 else e3 }
MultiIfE [(Guard, Exp)]
{ if | g1 -> e1 | g2 -> e2 }
LetE [Dec] Exp
{ let x=e1;   y=e2 in e3 }
CaseE Exp [Match]
{ case e of m1; m2 }
DoE [Stmt]
{ do { p <- e1; e2 }  }
CompE [Stmt]
{ [ (x,y) | x <- xs, y <- ys ] }

Выражение-результат вхождения находится в самом конце Stmt, и должно быть NoBindS.

Например:

[ f x | x <- xs ]
CompE [BindS (VarP x) (VarE xs), NoBindS (AppE (VarE f) (VarE x))]
ArithSeqE Range
{ [ 1 ,2 .. 10 ] }
ListE [Exp]
{ [1,2,3] }
SigE Exp Type
{ e :: t }
RecConE Name [FieldExp]
{ T { x = y, z = w } }
RecUpdE Exp [FieldExp]
{ (f x) { z = w } }
StaticE Exp
{ static e }

Примеры реализации

Eq Exp
Data Exp
Ord Exp
Show Exp
Generic Exp
Ppr Exp
type Rep Exp

type FieldExp = (Name, Exp) Исходный код

data Body Исходный код

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

GuardedB [(Guard, Exp)]
f p { | e1 = e2
      | e3 = e4 }
 where ds
NormalB Exp
f p { = e } where ds

Примеры реализации

Eq Body
Data Body
Ord Body
Show Body
Generic Body
type Rep Body

data Guard Исходный код

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

NormalG Exp
f x { | odd x } = x
PatG [Stmt]
f x { | Just y <- x, Just z <- y } = z

Примеры реализации

Eq Guard
Data Guard
Ord Guard
Show Guard
Generic Guard
type Rep Guard

data Stmt Исходный код

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

BindS Pat Exp
LetS [Dec]
NoBindS Exp
ParS [[Stmt]]

Экземпляры

Eq Stmt
Data Stmt
Ord Stmt
Show Stmt
Generic Stmt
Ppr Stmt
type Rep Stmt

data Range Source

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

FromR Exp
FromThenR Exp Exp
FromToR Exp Exp
FromThenToR Exp Exp Exp

Экземпляры

Eq Range
Data Range
Ord Range
Show Range
Generic Range
Ppr Range
type Rep Range

data Dec Source

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

FunD Name [Clause]
{ f p1 p2 = b where decs }
ValD Pat Body [Dec]
{ p = b where decs }
DataD Cxt Name [TyVarBndr] [Con] [Name]
{ data Cxt x => T x = A x | B (T x)
       deriving (Z,W)}
NewtypeD Cxt Name [TyVarBndr] Con [Name]
{ newtype Cxt x => T x = A (B x)
       deriving (Z,W)}
TySynD Name [TyVarBndr] Type
{ type T x = (x,x) }
ClassD Cxt Name [TyVarBndr] [FunDep] [Dec]
{ class Eq a => Ord a where ds }
InstanceD Cxt Type [Dec]
{ instance Show w => Show [w]
       where ds }
SigD Name Type
{ length :: [a] -> Int }
ForeignD Foreign
{ foreign import ... }
{ foreign export ... }
InfixD Fixity Name
{ infix 3 foo }
PragmaD Pragma
{ {--} }
FamilyD FamFlavour Name [TyVarBndr] (Maybe Kind)
{ type family T a b c :: * }
DataInstD Cxt Name [Type] [Con] [Name]
{ data instance Cxt x => T [x] = A x
                                | B (T x)
       deriving (Z,W)}
NewtypeInstD Cxt Name [Type] Con [Name]
{ newtype instance Cxt x => T [x] = A (B x)
       deriving (Z,W)}
TySynInstD Name TySynEqn
{ type instance ... }
ClosedTypeFamilyD Name [TyVarBndr] (Maybe Kind) [TySynEqn]
{ type family F a b :: * where ... }
RoleAnnotD Name [Role]
{ type role T nominal representational }
StandaloneDerivD Cxt Type
{ deriving instance Ord a => Ord (Foo a) }
DefaultSigD Name Type
{ default size :: Data a => a -> Int }

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

Eq Dec
Data Dec
Ord Dec
Show Dec
Generic Dec
Ppr Dec
type Rep Dec

data TySynEqn Источник

Одно уравнение в примере типа семейства или закрытом типе семейства. Аргументами являются шаблоны типов левой части и результат правой части.

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

TySynEqn [Тип] Тип

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

Eq TySynEqn
Data TySynEqn
Ord TySynEqn
Show TySynEqn
Generic TySynEqn
type Rep TySynEqn

data FunDep Источник

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

FunDep [Имя] [Имя]

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

Eq FunDep
Data FunDep
Ord FunDep
Show FunDep
Generic FunDep
Ppr FunDep
type Rep FunDep

data FamFlavour Источник

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

TypeFam
DataFam

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

Eq FamFlavour
Data FamFlavour
Ord FamFlavour
Show FamFlavour
Generic FamFlavour
Ppr FamFlavour
type Rep FamFlavour

data Foreign Источник

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

ImportF Callconv Безопасность Строка Имя Тип
ExportF Callconv Строка Имя Тип

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

Eq Foreign
Data Foreign
Ord Foreign
Show Foreign
Generic Foreign
Ppr Foreign
type Rep Foreign

data Callconv Источник

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

CCall
StdCall
CApi
Prim
JavaScript

Примеры

Eq Callconv
Data Callconv
Ord Callconv
Show Callconv
Generic Callconv
type Rep Callconv

data Безопасность Источник

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

Небезопасный
Безопасный
Прерывистый

Примеры

Eq Безопасность
Data Безопасность
Ord Безопасность
Show Безопасность
Generic Безопасность
type Rep Безопасность

data Директива Источник

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

InlineP Имя Inline RuleMatch Фазы
SpecialiseP Имя Тип (МожетБыть Inline) Фазы
SpecialiseInstP Тип
RuleP Строка [RuleBndr] Exp Exp Фазы
AnnP AnnTarget Exp
LineP Целое Строка

Примеры

Eq Директива
Data Директива
Ord Директива
Show Директива
Generic Директива
Ppr Директива
type Rep Директива

data Inline Источник

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

БезInline
Inline
Inlinable

Примеры

Eq Inline
Data Inline
Ord Inline
Show Inline
Generic Inline
Ppr Inline
type Rep Inline

data СопоставлениеПравил Источник

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

ConLike
FunLike

Примеры

Eq СопоставлениеПравил
Data СопоставлениеПравил
Ord СопоставлениеПравил
Show СопоставлениеПравил
Generic СопоставлениеПравил
Ppr СопоставлениеПравил
type Rep СопоставлениеПравил

data Фазы Источник

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

ВсеФазы
ОтФазы Целое
ПередФазой Целое

Примеры

Eq Phases
Data Phases
Ord Phases
Show Phases
Generic Phases
Ppr Phases
type Rep Phases

data RuleBndr Source

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

RuleVar Name
TypedRuleVar Name Type

Примеры

Eq RuleBndr
Data RuleBndr
Ord RuleBndr
Show RuleBndr
Generic RuleBndr
Ppr RuleBndr
type Rep RuleBndr

data AnnTarget Source

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

ModuleAnnotation
TypeAnnotation Name
ValueAnnotation Name

Примеры

Eq AnnTarget
Data AnnTarget
Ord AnnTarget
Show AnnTarget
Generic AnnTarget
type Rep AnnTarget

type Cxt Source

Аргументы

= [Pred]
(Eq a, Ord b)

type Pred = Type Source

С момента появления ConstraintKinds, ограничения — это просто типы. Ограничения равенства используют конструктор EqualityT. Ограничения также могут быть кортежами других ограничений.

data Strict Source

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

IsStrict
NotStrict
Unpacked

Примеры

Eq Strict
Data Strict
Ord Strict
Show Strict
Generic Strict
type Rep Strict

data Con Source

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

NormalC Name [StrictType]
C Int a
RecC Name [VarStrictType]
C { v :: Int, w :: a }
InfixC StrictType Name StrictType
Int :+ a
ForallC [TyVarBndr] Cxt Con
forall a. Eq a => C [a]

Примеры

Eq Con
Data Con
Ord Con
Show Con
Generic Con
Ppr Con
type Rep Con

type StrictType = (Strict, Type) Source

тип VarStrictType = (Имя, Строгий, Тип) Исходный код

данные Тип Исходный код

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

ForallT [TyVarBndr] Cxt Тип
forall <vars>. <ctxt> -> <type>
AppT Тип Тип
T a b
SigT Тип Вид
t :: k
VarT Имя
a
ConT Имя
T
PromotedT Имя
'T
TupleT Целое
(,), (,,), etc.
UnboxedTupleT Целое
(), (), etc.
ArrowT
->
EqualityT
~
ListT
[]
PromotedTupleT Целое
'(), '(,), '(,,), etc.
PromotedNilT
'[]
PromotedConsT
(':)
StarT
*
ConstraintT
Constraint
LitT TyLit
0,1,2, etc.

Примеры

Eq Тип
Данные Тип
Ord Тип
Показать Тип
Генерический Тип
Ppr Тип
тип Rep Тип

данные TyVarBndr Исходный код

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

PlainTV Имя
a
KindedTV Имя Вид
(a :: k)

Примеры

Eq TyVarBndr
Данные TyVarBndr
Ord TyVarBndr
Показать TyVarBndr
Генерический TyVarBndr
Ppr TyVarBndr
тип Rep TyVarBndr

данные TyLit Исходный код

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

NumTyLit Целое
2
StrTyLit Строка
Hello

Примеры

Eq TyLit
Данные TyLit
Ord TyLit
Показать TyLit
Генерический TyLit
Ppr TyLit
тип Rep TyLit

данные Роль Исходный код

Аннотации роли

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

NominalR
nominal
RepresentationalR
representational
PhantomR
phantom
InferR
_

Примеры

Eq Роль
Данные Роль
Ord Роль
Показать Роль
Генерический Роль
Ppr Роль
тип Rep Роль

данные AnnLookup Исходный код

Целевое аннотаций для reifyAnnotations

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

AnnLookupModule Модуль
AnnLookupName Имя

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

Eq AnnLookup
Data AnnLookup
Ord AnnLookup
Show AnnLookup
Generic AnnLookup
type Rep AnnLookup

type Тип = Тип Источник

Для избежания дублирования между типами и видами, они определены как одинаковые. Естественно, у вас никогда не будет типа StarT и вы никогда не будете иметь вид SigT, но многие другие конструкторы совпадают. Обратите внимание, что вид Bool обозначается ConT, а не PromotedT. Аналогично, кортежи видов создаются с помощью TupleT, а не PromotedTupleT.

cmpEq :: Порядок -> Булево Источник

thenCmp :: Порядок -> Порядок -> Порядок Источник

© 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/template-haskell-2.10.0.0/Language-Haskell-TH-Syntax.html

Spec-Zone.ru

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