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
Методы
Аргументы
| :: Bool | |
| -> String | |
| -> m () | Сообщить об ошибке (True) или предупреждении (False) ...но продолжить; использовать |
Аргументы
| :: m a | обработчик ошибок |
| -> m a | действие, которое может завершиться неудачей |
| -> m a | Восстановление из монадического |
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
Ввод/вывод (опасно)
qAddDependentFile :: FilePath -> m () Source
qAddTopDecls :: [Dec] -> m () Source
qAddModFinalizer :: Q () -> m () Source
badIO :: String -> IO a Source
unsafeTExpCoerce :: Q Exp -> Q (TExp a) Source
newName :: String -> Q Name Source
Сгенерировать новое имя, которое не может быть захвачено.
Например, это:
f = $(do nm1 <- newName "x" let nm2 =mkName"x" return (LamE[VarPnm1] (LamE [VarP nm2] (VarEnm1))) )
выведет сплейс
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
Сообщить пользователю о предупреждении и продолжить.
Восстановление после ошибок, поднятых 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 не пуст?
Расположение, в котором выполняется это вычисление.
Функция 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.
bindQ :: Q a -> (a -> Q b) -> Q b 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
Примеры использования
Получено из reifyModule и thisModule.
Примеры использования
newtype Имя_переменной Источник
Конструкторы
| Имя_переменной Строка |
Примеры использования
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 может быть захвачено, если то, на что оно ссылается, может быть изменено путем добавления новых объявлений.
Абстрактный тип, представляющий имена в дереве синтаксического анализа.
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, не могут.
Конструкторы
| Имя Имя_переменной Тип_имени |
data NameFlavour Source
Конструкторы
| NameS | Имя без квалификатора; динамически связанное |
| NameQ ModName | Квалифицированное имя; динамически связанное |
| NameU !Int | Уникальное локальное имя |
| NameL !Int | Локальное имя, связанное вне AST TH |
| NameG NameSpace PkgName ModName | Глобальное имя, связанное вне AST TH: Исходное имя (только вхождения, а не связующие элементы). Требуется также имя пространства, чтобы быть уверенным, что мы имеем в виду именно это. |
Реализации
Конструкторы
| VarName | Переменные |
| DataName | Конструкторы данных |
| TcClsName | Конструкторы типов и классы; в Haskell они пока находятся в одном пространстве имён. |
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
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
Конструкторы
| Loc | |
Поля
| |
Конструкторы
| ClassI Dec [InstanceDec] | Класс с перечнем видимых реализаций |
| ClassOpI Name Type ParentName Fixity | Метод класса |
| TyConI Dec | «Простой» конструктор типа. «Более сложные» конструкторы типов возвращаются с использованием |
| FamilyI Dec [InstanceDec] | Семейство типов или данных, с перечнем видимых реализаций. Закрытое семейство типов возвращается с 0 реализациями. |
| PrimTyConI Name Arity Unlifted | «Примитивный» конструктор типа, который нельзя выразить с помощью |
| DataConI Name Type ParentName Fixity | Конструктор данных |
| VarI Name Type (Maybe Dec) Fixity |
Переменная «значения» (в отличие от переменной типа, см. Поле |
| TyVarI Name Type |
Переменная типа. Поле |
data ModuleInfo Source
Получено из reifyModule в Q Monad.
Конструкторы
| ModuleInfo [Module] | Содержит список импортов модуля. |
Примеры использования
type ИмяРодителя = Имя Источник
В ClassOpI и DataConI, имя родительского класса или типа
В PrimTyConI, арность конструктора типа
type Неподнятый = Булево Источник
В PrimTyConI, является ли конструктор типа неподнятым?
type ДекларацияПримера = Декларация Источник
InstanceDec описывает отдельный пример класса или функции типа. Это просто Dec, но гарантируется, что он будет одним из следующих:
-
InstanceD(с пустым[Dec]) -
DataInstDилиNewtypeInstD(с пустым производным[Name]) TySynInstD
data Связанность Источник
Конструкторы
| Связанность Целое НаправлениеСвязанности |
Примеры использования
data НаправлениеСвязанности Источник
Конструкторы
| Левоассоциативное | |
| Правоассоциативное | |
| Нейтральное |
Примеры использования
МаксимальныйПриоритет :: Целое Источник
Наивысший разрешенный приоритет оператора для 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 конструкторы.
Конструкторы
| Символ Символ | |
| Строка Строка | |
| ЦелоеЧисло ЦелоеЧисло | Используется для перегруженных и неперегруженных литералов. У нас нет хорошего способа представить неперегруженные литералы в данный момент. Возможно, это не имеет значения? |
| РациональноеЧисло РациональноеЧисло | |
| ЦелоеПримитив ЦелоеЧисло | |
| СловоПримитив ЦелоеЧисло | |
| ЧислоСПлавающейТочкойПримитив РациональноеЧисло | |
| ДвойноеЧислоСПлавающейТочкойПримитив РациональноеЧисло | |
| СтрокаПримитив [Слово8] | Примитивная строка в стиле C, тип Addr# |
Шаблон в Haskell, заданный в {}
Конструкторы
| LitP Lit | { 5 or |
| 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
|
| ParensP Pat |
{(p)}
|
| 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 } |
type FieldPat = (Имя, Pat) Источник
data Сопоставление Источник
Конструкторы
| Сопоставление Pat Тело [Dec] | case e of { pat -> body where decs } |
Примеры реализации
Примеры реализации
Конструкторы
| VarE Name | { x } |
| ConE Name | data T1 = C1 t1 t2; p = {C1} e1 e2 |
| LitE Lit | { 5 or |
| AppE Exp Exp | { f x } |
| InfixE (Maybe Exp) Exp (Maybe Exp) | {x + y} or {(x+)} or {(+ x)} or {(+)} |
| UInfixE Exp Exp Exp |
{x + y}
|
| ParensE Exp |
{ (e) }
|
| 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 ] }
Выражение-результат вхождения находится в самом конце Например: [ 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 } |
type FieldExp = (Name, Exp) Исходный код
data Body Исходный код
Конструкторы
| GuardedB [(Guard, Exp)] | f p { | e1 = e2
| e3 = e4 }
where ds |
| NormalB Exp | f p { = e } where ds |
data Guard Исходный код
data Stmt Исходный код
Конструкторы
| 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 } |
Одно уравнение в примере типа семейства или закрытом типе семейства. Аргументами являются шаблоны типов левой части и результат правой части.
Примеры использования
Примеры использования
data FamFlavour Источник
Примеры использования
Примеры использования
Конструкторы
| CCall | |
| StdCall | |
| CApi | |
| Prim | |
| JavaScript |
data Безопасность Источник
Конструкторы
| Небезопасный | |
| Безопасный | |
| Прерывистый |
Примеры
Конструкторы
| InlineP Имя Inline RuleMatch Фазы | |
| SpecialiseP Имя Тип (МожетБыть Inline) Фазы | |
| SpecialiseInstP Тип | |
| RuleP Строка [RuleBndr] Exp Exp Фазы | |
| AnnP AnnTarget Exp | |
| LineP Целое Строка |
Примеры
data СопоставлениеПравил Источник
Примеры
Конструкторы
| ВсеФазы | |
| ОтФазы Целое | |
| ПередФазой Целое |
Конструкторы
| RuleVar Name | |
| TypedRuleVar Name Type |
Примеры
Конструкторы
| ModuleAnnotation | |
| TypeAnnotation Name | |
| ValueAnnotation Name |
Примеры
Аргументы
| = [Pred] | (Eq a, Ord b) |
С момента появления ConstraintKinds, ограничения — это просто типы. Ограничения равенства используют конструктор EqualityT. Ограничения также могут быть кортежами других ограничений.
Конструкторы
| 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] |
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. |
данные TyVarBndr Исходный код
Примеры
данные TyLit Исходный код
данные Роль Исходный код
Аннотации роли
Конструкторы
| NominalR | nominal |
| RepresentationalR | representational |
| PhantomR | phantom |
| InferR | _ |
данные AnnLookup Исходный код
Целевое аннотаций для reifyAnnotations
Конструкторы
| AnnLookupModule Модуль | |
| AnnLookupName Имя |
Примеры использования
Для избежания дублирования между типами и видами, они определены как одинаковые. Естественно, у вас никогда не будет типа StarT и вы никогда не будете иметь вид SigT, но многие другие конструкторы совпадают. Обратите внимание, что вид Bool обозначается ConT, а не PromotedT. Аналогично, кортежи видов создаются с помощью TupleT, а не PromotedTupleT.
© 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