Spec-Zone.ru › Haskell 7

Compiler.Hoopl

Safe Haskell Safe
Язык Haskell2010

Содержание

  • Тело
  • Граф
    • Создание графов
    • Сплайсинг графов
    • Отображения
    • Склады
    • Извлечение меток
    • Обходы в глубину
  • Формы
  • Блоки
    • Предикаты для блоков
    • Создание блоков
    • Разобрать блоки
    • Изменение блоков
    • Преобразование в списки и из списков
    • Отображения и сложения
    • Смещение
  • Служебные функции для клиентов
  • Учёт топлива

Тело

type Тело n = LabelMap (Блок n C C) Источник

Возможная пустая коллекция закрытых/закрытых блоков

type Тело' block n = LabelMap (block n C C) Источник

Body абстрагировано над block

emptyBody :: Тело' block n Источник

bodyList :: NonLocal (block n) => Тело' block n -> [(Метка, block n C C)] Источник

addBlock :: NonLocal thing => thing C C -> LabelMap (thing C C) -> LabelMap (thing C C) Источник

bodyUnion :: forall a. LabelMap a -> LabelMap a -> LabelMap a Источник

Граф

type Граф = Граф' Блок Источник

Граф потока управления, который может иметь любую из четырёх форм (O/O, OC, CO, C/C). Открытый в начале граф имеет единственную, выделенную, безымянную точку входа; если граф закрыт в начале, его точки входа предоставляются контекстом.

data Граф' block n e x where Источник

Graph' абстрагируется над типом блока, чтобы мы могли, например, строить графы аннотированных блоков (Compiler.Hoopl.Dataflow нуждается в этом).

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

GNil :: Граф' block n O O
GUnit :: block n O O -> Граф' block n O O
GMany :: MaybeO e (block n O C) -> Тело' block n -> MaybeO x (block n C O) -> Граф' block n e x

class NonLocal thing where Источник

Предоставляет доступ к точкам закрепления для внелокальных рёбер, а также к самим рёбрам

Методы

entryLabel Источник

Аргументы

:: thing C x
-> Метка

Метка первого узла или блока

successors Источник

Аргументы

:: thing e C
-> [Метка]

Возвращает преемников потока управления

Примеры

NonLocal n => NonLocal (Блок n)

Создание графов

bodyGraph :: Тело n -> Граф n C C Источник

blockGraph :: NonLocal n => Блок n e x -> Граф n e x Источник

gUnitOO :: block n O O -> Граф' block n O O Источник

gUnitOC :: block n O C -> Граф' block n O C Источник

gUnitCO :: block n C O -> Граф' block n C O Источник

gUnitCC :: NonLocal (block n) => block n C C -> Граф' block n C C Источник

catGraphNodeOC :: NonLocal n => Граф n e O -> n O C -> Граф n e C Источник

catGraphNodeOO :: Граф n e O -> n O O -> Граф n e O Источник

catNodeCOGraph :: NonLocal n => n C O -> Граф n O x -> Граф n C x Источник

catNodeOOGraph :: n O O -> Graph n O x -> Graph n O x Исходный код

Сплайсинг графов

splice :: forall block n e a x. NonLocal (block n) => (forall e x. block n e O -> block n O x -> block n e x) -> Graph' block n e a -> Graph' block n a x -> Graph' block n e x Исходный код

gSplice :: NonLocal n => Graph n e a -> Graph n a x -> Graph n e x Исходный код

Карты

mapGraph :: (forall e x. n e x -> n' e x) -> Graph n e x -> Graph n' e x Исходный код

Применяет функцию ко всем узлам в графе.

mapGraphBlocks :: forall block n block' n' e x. (forall e x. block n e x -> block' n' e x) -> Graph' block n e x -> Graph' block' n' e x Исходный код

Функция mapGraphBlocks позволяет изменить представление блоков, узлов или обоих одновременно. Она поднимает полиморфную трансформацию блока в полиморфную трансформацию графа. При стабилизации представления блоков должна быть предоставлена аналогичная функция для блоков.

Склады

foldGraphNodes :: forall n a. (forall e x. n e x -> a -> a) -> forall e x. Graph n e x -> a -> a Исходный код

Применяет функцию к каждому узлу в графе. Функция сложения должна быть полиморфной по форме узлов.

Извлечение меток

labelsDefined :: forall block n e x. NonLocal (block n) => Graph' block n e x -> LabelSet Исходный код

labelsUsed :: forall block n e x. NonLocal (block n) => Graph' block n e x -> LabelSet Исходный код

externalEntryLabels :: forall n. NonLocal n => LabelMap (Block n C C) -> LabelSet Исходный код

Поиски в глубину

postorder_dfs :: NonLocal (block n) => Graph' block n O x -> [block n C C] Исходный код

Обход: postorder_dfs возвращает список блоков, доступных из входа в проходимый граф. Вход и выход *не* включены. Список имеет следующее свойство:

Пусть "обратная ссылка" существует, если один из блоков-преемников управления предшествует ему в выходном списке

Тогда обратных ссылок как можно меньше

Вывод подходит для использования в задаче прямого потока данных. Для задачи обратного потока просто переверните список. (postorder_dfs достаточно сложно реализовать, чтобы не пытаться поддерживать как прямой, так и обратный варианты.)

postorder_dfs_from :: (NonLocal block, LabelsPtr b) => LabelMap (block C C) -> b -> [block C C] Исходный код

postorder_dfs_from_except :: forall block e. (NonLocal block, LabelsPtr e) => LabelMap (block C C) -> e -> LabelSet -> [block C C] Исходный код

preorder_dfs :: NonLocal (block n) => Graph' block n O x -> [block n C C] Исходный код

preorder_dfs_from_except :: forall block e. (NonLocal block, LabelsPtr e) => LabelMap (block C C) -> e -> LabelSet -> [block C C] Исходный код

class LabelsPtr l where Исходный код

Методы

targetLabels :: l -> [Label] Исходный код

Примеры

LabelsPtr LabelSet
LabelsPtr Label
LabelsPtr l => LabelsPtr [l]
NonLocal n => LabelsPtr (n e C)

Формы

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

Используется на уровне типов для обозначения «открытой» структуры с уникальной, безымянной ветвью потока управления, входящей или выходящей. Разрешено «проваливание» и конкатенация в открытой точке.

Примеры

IfThenElseable O
type Fact O f = f
type IndexedCO O a b = b

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

Используется на уровне типов для обозначения «закрытой» структуры, которая поддерживает передачу управления только с помощью именованных меток — «проваливание» запрещено. Количество веток потока управления не ограничено.

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

IfThenElseable C
NonLocal n => LabelsPtr (n e C)
type Fact C f = FactBase f
type IndexedCO C a b = a

data MaybeO ex t where Source

Тип Maybe, индексированный по открытым/закрытым значениям

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

JustO :: t -> MaybeO O t
NothingO :: MaybeO C t

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

Functor (MaybeO ex)

data MaybeC ex t where Source

Тип Maybe, индексированный по закрытым/открытым значениям

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

JustC :: t -> MaybeC C t
NothingC :: MaybeC O t

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

Functor (MaybeC ex)

type family IndexedCO ex a b :: * Source

Тип Either, индексированный по закрытым/открытым значениям, используя типы семейств

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

type IndexedCO C a b = a
type IndexedCO O a b = b

data Shape ex where Source

Значение динамической формы

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

Closed :: Shape C
Open :: Shape O

Блоки

data Block n e x where Source

Последовательность узлов. Может иметь одну из четырёх форм (OO, OC, CO, CC). Открытый вход означает единственный вход, аналогично для выхода. Закрытый блок — это базовый блок, который нельзя расширить дальше. Клиенты должны избегать манипуляций с блоками и придерживаться узлов или графов.

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

BlockCO :: n C O -> Block n O O -> Block n C O
BlockCC :: n C O -> Block n O O -> n O C -> Block n C C
BlockOC :: Block n O O -> n O C -> Block n O C
BNil :: Block n O O
BMiddle :: n O O -> Block n O O
BCat :: Block n O O -> Block n O O -> Block n O O
BSnoc :: Block n O O -> n O O -> Block n O O
BCons :: n O O -> Block n O O -> Block n O O

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

NonLocal n => NonLocal (Block n)

Предикаты для блоков

isEmptyBlock :: Block n e x -> Bool Source

Создание блоков

emptyBlock :: Block n O O Source

blockCons :: n O O -> Block n O x -> Block n O x Source

blockSnoc :: Block n e O -> n O O -> Block n e O Source

blockJoinHead :: n C O -> Block n O x -> Block n C x Source

blockJoinTail :: Block n e O -> n O C -> Block n e C Source

blockJoin :: n C O -> Block n O O -> n O C -> Block n C C -> Block n O C -> Block n C C Source

blockJoinAny :: (MaybeC e (n C O), Block n O O, MaybeC x (n O C)) -> Block n e x Source

Преобразовать список узлов в блок. Узел входа и выхода должны или не должны присутствовать в зависимости от формы блока.

blockAppend :: Block n e O -> Block n O x -> Block n e x Source

Разобрать блоки

firstNode :: Block n C x -> n C O Source

lastNode :: Block n x C -> n O C Source

endNodes :: Block n C C -> (n C O, n O C) Source

blockSplitHead :: Block n C x -> (n C O, Block n O x) Source

blockSplitTail :: Block n e C -> (Block n e O, n O C) Source

blockSplit :: Block n C C -> (n C O, Block n O O, n O C) Source

Разделить закрытый блок на входной узел, открытый средний блок и выходной узел.

blockSplitAny :: Block n e x -> (MaybeC e (n C O), Block n O O, MaybeC x (n O C)) Source

Изменение блоков

replaceFirstNode :: Block n C x -> n C O -> Block n C x Source

replaceLastNode :: Block n x C -> n O C -> Block n x C Source

Преобразование в списки и из них

blockToList :: Block n O O -> [n O O] Source

blockFromList :: [n O O] -> Block n O O Source

Карты и слияния

mapBlock :: (forall e x. n e x -> n' e x) -> Block n e x -> Block n' e x Source

Применить функцию к узлам Block

mapBlock' :: (forall e x. n e x -> n' e x) -> Block n e x -> Block n' e x Source

Строгое mapBlock

mapBlock3' :: forall n n' e x. (n C O -> n' C O, n O O -> n' O O, n O C -> n' O C) -> Block n e x -> Block n' e x Source

Применить функцию к узлам блока, с разными функциями для входных, средних и выходных узлов соответственно. Карта строгая.

foldBlockNodesF :: forall n a. (forall e x. n e x -> a -> a) -> forall e x. Block n e x -> IndexedCO e a a -> IndexedCO x a a Source

foldBlockNodesF3 :: forall n a b c. (n C O -> a -> b, n O O -> b -> b, n O C -> b -> c) -> forall e x. Block n e x -> IndexedCO e a b -> IndexedCO x c b Source

Применить функцию к каждому узлу блока, вперед или назад. Функция слияния должна быть полиморфной по форме узлов.

foldBlockNodesB :: forall n a. (forall e x. n e x -> a -> a) -> forall e x. Block n e x -> IndexedCO x a a -> IndexedCO e a a Source

foldBlockNodesB3 :: forall n a b c. (n C O -> b -> c, n O O -> b -> b, n O C -> a -> b) -> forall e x. Block n e x -> IndexedCO x a b -> IndexedCO e c b Source

Установление приоритетов

frontBiasBlock :: Блок n e x -> Блок n e x Источник

Блок считается «сдвинутым влево» (front biased), если левое поддерево каждой операции конкатенации является узлом, а не общим блоком; блок сдвинутый влево аналогичен обычному списку. Если блок сдвинут влево, его узлы можно пройти спереди назад без рекурсии по общему случаю; достаточно хвостовой рекурсии. Не все структуры могут быть сдвинуты влево; замкнутый/открытый блок по своей природе сдвинут вправо.

backBiasBlock :: Блок n e x -> Блок n e x Источник

Блок считается «сдвинутым вправо» (back biased), если правое поддерево каждой операции конкатенации является узлом, а не общим блоком; блок сдвинутый вправо аналогичен списку snoc. Если блок сдвинут вправо, его узлы можно пройти сзади вперед без рекурсии по общему случаю; достаточно хвостовой рекурсии. Не все структуры могут быть сдвинуты вправо; открытый/замкнутый блок по своей природе сдвинут влево.

data АБстрактныйГраф n e x Источник

Тип абстрактных графов. Предлагает дополнительные «умные конструкторы», которые могут потреблять новые метки во время создания.

graphOfAGraph :: АБстрактныйГраф n e x -> forall m. ЕдинственныйМонадный m => m (Граф n e x) Источник

Получить абстрактный AGraph и создать конкретный (если монадный) Graph.

aGraphOfGraph :: Граф n e x -> АБстрактныйГраф n e x Источник

Преобразовать граф в абстрактный.

(<*>) :: (GraphRep g, НеЛокальный n) => g n e O -> g n O x -> g n e x infixl 3 Источник

Конкатенация двух графов; поток управления идёт слева направо.

(|*><*|) :: (GraphRep g, НеЛокальный n) => g n e C -> g n C x -> g n e x infixl 2 Источник

Соединение двух графов в замкнутой точке; ничего не известно о потоке управления.

catGraphs :: (GraphRep g, НеЛокальный n) => [g n O O] -> g n O O Источник

Удобная конкатенация последовательности открытых/открытых графов с использованием <*>.

addEntrySeq :: НеЛокальный n => АБстрактныйГраф n O C -> АБстрактныйГраф n C x -> АБстрактныйГраф n O x Источник

Устарело: используйте |*><*| вместо этого.

addExitSeq :: НеЛокальный n => АБстрактныйГраф n e C -> АБстрактныйГраф n C O -> АБстрактныйГраф n e O Источник

Устарело: используйте |*><*| вместо этого.

addBlocks :: УзелHoopl n => АБстрактныйГраф n e x -> АБстрактныйГраф n C C -> АБстрактныйГраф n e x Источник

Расширить существующий AGraph дополнительными базовыми блоками «вне очереди». Поток управления не подразумевается. Simon PJ должен привести пример использования.

unionBlocks :: НеЛокальный n => АБстрактныйГраф n C C -> АБстрактныйГраф n C C -> АБстрактныйГраф n C C Источник

Устарело: используйте |*><*| вместо этого.

пустойГраф :: GraphRep g => g n O O Источник

Пустой граф, открытый на входе и выходе. Он является левым и правым тождеством для <*>.

пустойЗакрытыйГраф :: GraphRep g => g n C C Источник

Пустой граф, закрытый на входе и выходе. Он является левым и правым тождеством для |*><*|.

withFresh :: Uniques u => (u -> АБстрактныйГраф n e x) -> АБстрактныйГраф n e x Источник

mkFirst :: GraphRep g => n C O -> g n C O Источник

Создать граф из первого узла

mkMiddle :: GraphRep g => n O O -> g n O O Источник

Создать граф из среднего узла

mkMiddles :: (GraphRep g, НеЛокальный n) => [n O O] -> g n O O Источник

Удобная конкатенация последовательности средних узлов для образования открытого/открытого графа.

mkLast :: GraphRep g => n O C -> g n O C Источник

Создать граф из последнего узла

mkBranch :: (GraphRep g, УзелHoopl n) => Метка -> g n O C Источник

Создать граф, разветвляющийся к метке.

mkLabel :: (GraphRep g, УзелHoopl n) => Метка -> g n C O Источник

Создать граф, определяющий метку.

mkWhileDo Источник

Аргументы

:: HooplNode n
=> (Label -> Label -> AGraph n O C)

условие цикла

-> AGraph n O O

тело цикла

-> AGraph n O O

окончательный цикл while

class IfThenElseable x where Source

Методы

mkIfThenElse Source

Аргументы

:: HooplNode n
=> (Label -> Label -> AGraph n O C)

условие ветвления

-> AGraph n O x

код в ветви "then"

-> AGraph n O x

код в ветви "else"

-> AGraph n O x

результирующая конструкция if-then-else

Преобразует конструкцию if-then-else высокого уровня в AGraph. Условие принимает в качестве аргументов метки ветвей true-false и возвращает граф с одним входом и двумя выходами, которые выходят на две метки.

Примеры

IfThenElseable C
IfThenElseable O

mkEntry :: GraphRep g => Block n O C -> g n O C Source

Создает граф, содержащий только последовательность входа

mkExit :: GraphRep g => Block n C O -> g n C O Source

Создает граф, содержащий только последовательность выхода

class NonLocal n => HooplNode n where Source

Для некоторых операций построения графов и некоторых оптимизаций Hoopl должен уметь создавать ребра потока управления, используя данный тип узлов n.

Методы

mkBranchNode :: Label -> n O C Source

Создает узел ветвления, источник ребра потока управления.

mkLabelNode :: Label -> n C O Source

Создает узел метки, цель (назначение) ребра потока управления.

Утилиты для клиентов

firstXfer :: NonLocal n => (n C O -> f -> f) -> n C O -> FactBase f -> f Source

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

distributeXfer :: NonLocal n => DataflowLattice f -> (n O C -> f -> f) -> n O C -> f -> FactBase f Source

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

distributeFact :: NonLocal n => n O C -> f -> FactBase f Source

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

distributeFactBwd :: NonLocal n => n C O -> f -> FactBase f Source

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

successorFacts :: NonLocal n => n O C -> FactBase f -> [f] Source

Список (без меток) фактов из потомков последнего узла

joinFacts :: DataflowLattice f -> Label -> [f] -> f Source

Объединить список фактов.

joinOutFacts :: NonLocal node => DataflowLattice f -> node O C -> FactBase f -> f Source

Устарело: должно быть заменено на 'joinFacts lat l (successorFacts n f)'; как есть, оно использует неправильную метку

joinMaps :: Ord k => JoinFun v -> JoinFun (Map k v) Source

Часто данные потока фактов представляются в виде отображения переменных на некоторые факты о расположениях. Для этих отображений операция объединения на отображении может быть выражена в терминах объединения каждого элемента кодомена:

analyzeAndRewriteFwdBody :: forall m n f entries. (CheckpointMonad m, NonLocal n, LabelsPtr entries) => FwdPass m n f -> entries -> Body n -> FactBase f -> m (Body n, FactBase f) Source

Анализ и переработка потока данных вперёд для специального случая Body. Необходимо указать набор точек входа; блоки, недоступные из набора, удаляются.

analyzeAndRewriteBwdBody :: forall m n f entries. (CheckpointMonad m, NonLocal n, LabelsPtr entries) => BwdPass m n f -> entries -> Body n -> FactBase f -> m (Body n, FactBase f) Source

Обратный анализ потока данных и переработка для специального случая Body. Должен быть предоставлен набор точек входа; блоки, недоступные из набора, удаляются.

analyzeAndRewriteFwdOx :: forall m n f x. (CheckpointMonad m, NonLocal n) => FwdPass m n f -> Graph n O x -> f -> m (Graph n O x, FactBase f, MaybeO x f) Source

Прямой анализ потока данных и переработка для специального случая графа, открытого в точке входа. Этот специальный случай освобождает клиента от необходимости указывать сигнатуру типа для NothingO, что может быть непонятно новичкам и раздражать экспертов.

analyzeAndRewriteBwdOx :: forall m n f x. (CheckpointMonad m, NonLocal n) => BwdPass m n f -> Graph n O x -> Fact x f -> m (Graph n O x, FactBase f, f) Source

Обратный анализ потока данных и переработка для специального случая графа, открытого в точке входа. Этот специальный случай освобождает клиента от необходимости указывать сигнатуру типа для NothingO, что может быть непонятно новичкам и раздражать экспертов.

class IsSet set where Source

Типы-ассоциированные

type ElemOf set Source

Методы

setNull :: set -> Bool Source

setSize :: set -> Int Source

setMember :: ElemOf set -> set -> Bool Source

setEmpty :: set Source

setSingleton :: ElemOf set -> set Source

setInsert :: ElemOf set -> set -> set Source

setDelete :: ElemOf set -> set -> set Source

setUnion :: set -> set -> set Source

setDifference :: set -> set -> set Source

setIntersection :: set -> set -> set Source

setIsSubsetOf :: set -> set -> Bool Source

setFold :: (ElemOf set -> b -> b) -> b -> set -> b Source

setElems :: set -> [ElemOf set] Source

setFromList :: [ElemOf set] -> set Source

Примеры

IsSet UniqueSet
IsSet LabelSet

setInsertList :: IsSet set => [ElemOf set] -> set -> set Source

setDeleteList :: IsSet set => [ElemOf set] -> set -> set Source

setUnions :: IsSet set => [set] -> set Source

class IsMap map where Source

Типы-ассоциированные

type KeyOf map Source

Методы

mapNull :: map a -> Bool Source

mapSize :: map a -> Int Source

mapMember :: KeyOf map -> map a -> Bool Source

mapLookup :: KeyOf map -> map a -> Maybe a Source

mapFindWithDefault :: a -> KeyOf map -> map a -> a Source

mapEmpty :: map a Source

mapSingleton :: KeyOf map -> a -> map a Source

mapInsert :: KeyOf map -> a -> map a -> map a Source

mapInsertWith :: (a -> a -> a) -> KeyOf map -> a -> map a -> map a Source

mapDelete :: KeyOf map -> map a -> map a Source

mapUnion :: map a -> map a -> map a Source

mapUnionWithKey :: (KeyOf map -> a -> a -> a) -> map a -> map a -> map a Source

mapDifference :: map a -> map a -> map a Source

mapIntersection :: map a -> map a -> map a Source

mapIsSubmapOf :: Eq a => map a -> map a -> Bool Source

mapMap :: (a -> b) -> map a -> map b Source

mapMapWithKey :: (KeyOf map -> a -> b) -> map a -> map b Source

mapFold :: (a -> b -> b) -> b -> map a -> b Source

mapFoldWithKey :: (KeyOf map -> a -> b -> b) -> b -> map a -> b Source

mapFilter :: (a -> Bool) -> map a -> map a Source

mapElems :: map a -> [a] Source

mapKeys :: map a -> [KeyOf map] Source

mapToList :: map a -> [(KeyOf map, a)] Source

mapFromList :: [(KeyOf map, a)] -> map a Source

mapFromListWith :: (a -> a -> a) -> [(KeyOf map, a)] -> map a Source

Реализации

IsMap UniqueMap
IsMap LabelMap

mapInsertList :: IsMap map => [(KeyOf map, a)] -> map a -> map a Source

mapDeleteList :: IsMap map => [KeyOf map] -> map a -> map a Source

mapUnions :: IsMap map => [map a] -> map a Source

class Monad m => CheckpointMonad m where Source

Следует закону: для всех m do { s <- checkpoint; m; restart s } == return ()

Связанные типы

type Checkpoint m Source

Методы

checkpoint :: m (Checkpoint m) Source

restart :: Checkpoint m -> m () Source

Реализации

CheckpointMonad SimpleUniqueMonad
CheckpointMonad m => CheckpointMonad (InfiniteFuelMonad m)
CheckpointMonad m => CheckpointMonad (CheckingFuelMonad m)

data DataflowLattice a Source

Функция перевода может использовать флаг регистрации для управления отладкой, как, например, при обновлении только одного элемента в большом конечном отображении. Мы не хотим, чтобы Hoopl показывал весь факт, и только функция перевода знает точно, что изменилось.

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

DataflowLattice

Поля

fact_name :: String
fact_bot :: a
fact_join :: JoinFun a

type JoinFun a = Label -> OldFact a -> NewFact a -> (ChangeFlag, a) Источник

newtype OldFact a Источник

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

OldFact a

newtype NewFact a Источник

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

NewFact a

type family Fact x f :: * Источник

Примеры

type Fact C f = FactBase f
type Fact O f = f

mkFactBase :: forall f. DataflowLattice f -> [(Label, f)] -> FactBase f Источник

mkFactBase создаёт FactBase из списка пар (Label, факт). Если одна и та же метка появляется более одного раза, соответствующие факты объединяются.

data ChangeFlag Источник

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

NoChange
SomeChange

Примеры

Eq ChangeFlag
Ord ChangeFlag

changeIf :: Bool -> ChangeFlag Источник

data FwdPass m n f Источник

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

FwdPass

Поля

fp_lattice :: DataflowLattice f
fp_transfer :: FwdTransfer n f
fp_rewrite :: FwdRewrite m n f

newtype FwdTransfer n f Источник

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

FwdTransfer3

Поля

getFTransfer3 :: (n C O -> f -> f, n O O -> f -> f, n O C -> f -> FactBase f)

mkFTransfer :: (forall e x. n e x -> f -> Fact x f) -> FwdTransfer n f Источник

mkFTransfer3 :: (n C O -> f -> f) -> (n O O -> f -> f) -> (n O C -> f -> FactBase f) -> FwdTransfer n f Источник

newtype FwdRewrite m n f Источник

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

FwdRewrite3

Поля

getFRewrite3 :: (n C O -> f -> m (Maybe (Graph n C O, FwdRewrite m n f)), n O O -> f -> m (Maybe (Graph n O O, FwdRewrite m n f)), n O C -> f -> m (Maybe (Graph n O C, FwdRewrite m n f)))

mkFRewrite :: FuelMonad m => (forall e x. n e x -> f -> m (Maybe (Graph n e x))) -> FwdRewrite m n f Источник

Функции, переданные в mkFRewrite, не должны знать о поставке топлива. Результат, возвращённый mkFRewrite, учитывает топливо.

mkFRewrite3 :: forall m n f. FuelMonad m => (n C O -> f -> m (Maybe (Graph n C O))) -> (n O O -> f -> m (Maybe (Graph n O O))) -> (n O C -> f -> m (Maybe (Graph n O C))) -> FwdRewrite m n f Источник

Функции, переданные в mkFRewrite3, не должны знать о поставке топлива. Результат, возвращённый mkFRewrite3, учитывает топливо.

noFwdRewrite :: Monad m => FwdRewrite m n f Источник

wrapFR Источник

Аргументы

:: (forall e x. (n e x -> f -> m (Maybe (Graph n e x, FwdRewrite m n f))) -> n' e x -> f' -> m' (Maybe (Graph n' e x, FwdRewrite m' n' f')))

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

-> FwdRewrite m n f
-> FwdRewrite m' n' f'

wrapFR2 Источник

Аргументы

:: (forall e x. (n1 e x -> f1 -> m1 (Maybe (Graph n1 e x, FwdRewrite m1 n1 f1))) -> (n2 e x -> f2 -> m2 (Maybe (Graph n2 e x, FwdRewrite m2 n2 f2))) -> n3 e x -> f3 -> m3 (Maybe (Graph n3 e x, FwdRewrite m3 n3 f3)))

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

-> FwdRewrite m1 n1 f1
-> FwdRewrite m2 n2 f2
-> FwdRewrite m3 n3 f3

data BwdPass m n f Источник

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

BwdPass

Поля

bp_lattice :: DataflowLattice f
bp_transfer :: BwdTransfer n f
bp_rewrite :: BwdRewrite m n f

newtype BwdTransfer n f Источник

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

BwdTransfer3

Поля

getBTransfer3 :: (n C O -> f -> f, n O O -> f -> f, n O C -> FactBase f -> f)

mkBTransfer :: (forall e x. n e x -> Fact x f -> f) -> BwdTransfer n f Источник

mkBTransfer3 :: (n C O -> f -> f) -> (n O O -> f -> f) -> (n O C -> FactBase f -> f) -> BwdTransfer n f Источник

wrapBR Источник

Аргументы

:: (forall e x. Shape x -> (n e x -> Fact x f -> m (Maybe (Graph n e x, BwdRewrite m n f))) -> n' e x -> Fact x f' -> m' (Maybe (Graph n' e x, BwdRewrite m' n' f')))

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

-> BwdRewrite m n f
-> BwdRewrite m' n' f'

wrapBR2 Источник

Аргументы

:: (forall e x. Shape x -> (n1 e x -> Fact x f1 -> m1 (Maybe (Graph n1 e x, BwdRewrite m1 n1 f1))) -> (n2 e x -> Fact x f2 -> m2 (Maybe (Graph n2 e x, BwdRewrite m2 n2 f2))) -> n3 e x -> Fact x f3 -> m3 (Maybe (Graph n3 e x, BwdRewrite m3 n3 f3)))

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

-> BwdRewrite m1 n1 f1
-> BwdRewrite m2 n2 f2
-> BwdRewrite m3 n3 f3

newtype BwdRewrite m n f Источник

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

BwdRewrite3

Поля

getBRewrite3 :: (n C O -> f -> m (Maybe (Graph n C O, BwdRewrite m n f)), n O O -> f -> m (Maybe (Graph n O O, BwdRewrite m n f)), n O C -> FactBase f -> m (Maybe (Graph n O C, BwdRewrite m n f)))

mkBRewrite :: FuelMonad m => (forall e x. n e x -> Fact x f -> m (Maybe (Graph n e x))) -> BwdRewrite m n f Источник

Функции, переданные в mkBRewrite, не должны быть осведомлены о снабжении топливом. Результат, возвращаемый mkBRewrite, учитывает лимит топлива.

mkBRewrite3 :: forall m n f. FuelMonad m => (n C O -> f -> m (Maybe (Graph n C O))) -> (n O O -> f -> m (Maybe (Graph n O O))) -> (n O C -> FactBase f -> m (Maybe (Graph n O C))) -> BwdRewrite m n f Источник

Функции, переданные в mkBRewrite3, не должны быть осведомлены о снабжении топливом. Результат, возвращаемый mkBRewrite3, учитывает лимит топлива.

noBwdRewrite :: Monad m => BwdRewrite m n f Источник

analyzeAndRewriteFwd :: forall m n f e x entries. (CheckpointMonad m, NonLocal n, LabelsPtr entries) => FwdPass m n f -> MaybeC e entries -> Graph n e x -> Fact e f -> m (Graph n e x, FactBase f, MaybeO x f) Source

если анализируемый граф открыт на входе, не должно быть другой точки входа, иначе всё пойдёт ужасно не так...

analyzeAndRewriteBwd :: (CheckpointMonad m, NonLocal n, LabelsPtr entries) => BwdPass m n f -> MaybeC e entries -> Graph n e x -> Fact x f -> m (Graph n e x, FactBase f, MaybeO e f) Source

если анализируемый граф открыт на выходе, я не совсем понимаю последствия возможных других выходов

Уважение к топливу

Значение типа FwdRewrite или BwdRewrite уважает топливо, если любая функция, содержащаяся в значении, удовлетворяет следующим свойствам:

  • Когда топливо исчерпано, оно всегда возвращает Nothing.
  • Когда оно возвращает Just g rw, оно потребляет ровно одну единицу топлива, и новое переписывание rw также уважает топливо.

При условии, что функции, передаваемые в mkFRewrite, mkFRewrite3, mkBRewrite и mkBRewrite3, не знают о запасе топлива, результаты уважают топливо.

Это непроверенная ошибка времени выполнения для аргумента, переданного в wrapFR, wrapFR2, wrapBR или warpBR2, возвращать функцию, которая не уважает топливо.

data Label Source

Экземпляры

Eq Label
Ord Label
Show Label
LabelsPtr Label

freshLabel :: UniqueMonad m => m Label Source

data LabelSet Source

Экземпляры

Eq LabelSet
Ord LabelSet
Show LabelSet
IsSet LabelSet
LabelsPtr LabelSet
type ElemOf LabelSet = Label

data LabelMap v Source

Экземпляры

IsMap LabelMap
Eq v => Eq (LabelMap v)
Ord v => Ord (LabelMap v)
Show v => Show (LabelMap v)
type KeyOf LabelMap = Label

type FactBase f = LabelMap f Source

noFacts :: FactBase f Source

lookupFact :: Label -> FactBase f -> Maybe f Source

uniqueToLbl :: Unique -> Label Source

lblToUnique :: Label -> Unique Source

data Pointed t b a where Source

Добавляет верхний, нижний или оба элемента, чтобы помочь сформировать решётку

Параметры типа t и b используются для того, чтобы сказать, были ли добавлены верхний и нижний элементы. Аналогия с Block почти точная:

  • Block замкнут на входе тогда и только тогда, когда у него есть первый узел; Pointed замкнут сверху тогда и только тогда, когда у него есть верхний элемент.
  • Block замкнут на выходе тогда и только тогда, когда у него есть последний узел; Pointed замкнут снизу тогда и только тогда, когда у него есть нижний элемент.

Таким образом, у нас есть четыре возможных типа, из которых три интересны:

Pointed C C a
Тип a, расширенный как верхним, так и нижним элементами.
Pointed C O a
Тип a, расширенный только верхним элементом. (Предположительно a поставляется со своим собственным нижним элементом.)
Pointed O C a
Тип a, расширенный только нижним элементом.
Pointed O O a
Изоморфен a, и поэтому не интересен.

Преимущество всей этой GADT-ности заключается в том, что конструкторы Bot, Top и PElem могут использоваться полиморфно.

Тип 'Pointed t b' является экземпляром Functor и Show.

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

Bot :: Pointed t C a
PElem :: a -> Pointed t b a
Top :: Pointed C b a

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

Functor (Pointed t b)
Eq a => Eq (Pointed t b a)
Ord a => Ord (Pointed t b a)
Show a => Show (Pointed t b a)

addPoints :: String -> JoinFun a -> DataflowLattice (Pointed t C a) Источник

На основе функции объединения и имени создаёт полурешётку, добавляя элемент "дно", и, возможно, также элемент "верх". Специализированная версия addPoints'.

addPoints' :: forall a t. String -> (Label -> OldFact a -> NewFact a -> (ChangeFlag, Pointed t C a)) -> DataflowLattice (Pointed t C a) Источник

Более общий случай для создания новой решётки

addTop :: DataflowLattice a -> DataflowLattice (WithTop a) Источник

На основе функции объединения и имени создаёт полурешётку, добавляя элемент "верх", но не "дно". Звонящий должен предоставить элемент "дно".

addTop' :: forall a. String -> a -> (Label -> OldFact a -> NewFact a -> (ChangeFlag, WithTop a)) -> DataflowLattice (WithTop a) Источник

Более общий случай для создания новой решётки

liftJoinTop :: JoinFun a -> JoinFun (WithTop a) Источник

extendJoinDomain :: forall a. (Label -> OldFact a -> NewFact a -> (ChangeFlag, WithTop a)) -> JoinFun (WithTop a) Источник

type WithTop a = Pointed C O a Источник

Тип a с добавленным элементом "верх".

type WithBot a = Pointed O C a Источник

Тип a с добавленным элементом "дно".

type WithTopAndBot a = Pointed C C a Источник

Тип a с добавленными элементами "верх" и "дно".

thenFwdRw :: forall m n f. Monad m => FwdRewrite m n f -> FwdRewrite m n f -> FwdRewrite m n f Источник

deepFwdRw3 :: FuelMonad m => (n C O -> f -> m (Maybe (Graph n C O))) -> (n O O -> f -> m (Maybe (Graph n O O))) -> (n O C -> f -> m (Maybe (Graph n O C))) -> FwdRewrite m n f Источник

deepFwdRw :: FuelMonad m => (forall e x. n e x -> f -> m (Maybe (Graph n e x))) -> FwdRewrite m n f Источник

iterFwdRw :: forall m n f. Monad m => FwdRewrite m n f -> FwdRewrite m n f Источник

thenBwdRw :: forall m n f. Monad m => BwdRewrite m n f -> BwdRewrite m n f -> BwdRewrite m n f Источник

deepBwdRw3 :: FuelMonad m => (n C O -> f -> m (Maybe (Graph n C O))) -> (n O O -> f -> m (Maybe (Graph n O O))) -> (n O C -> FactBase f -> m (Maybe (Graph n O C))) -> BwdRewrite m n f Источник

deepBwdRw :: FuelMonad m => (forall e x. n e x -> Fact x f -> m (Maybe (Graph n e x))) -> BwdRewrite m n f Источник

iterBwdRw :: forall m n f. Monad m => BwdRewrite m n f -> BwdRewrite m n f Источник

pairFwd :: forall m n f f'. Monad m => FwdPass m n f -> FwdPass m n f' -> FwdPass m n (f, f') Источник

pairBwd :: forall m n f f'. Monad m => BwdPass m n f -> BwdPass m n f' -> BwdPass m n (f, f') Source

pairLattice :: forall f f'. DataflowLattice f -> DataflowLattice f' -> DataflowLattice (f, f') Source

type Fuel = Int Source

infiniteFuel :: Fuel Source

fuelRemaining :: FuelMonad m => m Fuel Source

Узнайте, сколько топлива осталось после вычисления. Может быть вычтено из начального количества топлива для получения общего потребления.

withFuel :: FuelMonad m => Maybe a -> m (Maybe a) Source

class Monad m => FuelMonad m where Source

Краткое описание методов

getFuel :: m Fuel Source

setFuel :: Fuel -> m () Source

Экземпляры

Monad m => FuelMonad (InfiniteFuelMonad m)
Monad m => FuelMonad (CheckingFuelMonad m)

class FuelMonadT fm where Source

Краткое описание методов

runWithFuel :: (Monad m, FuelMonad (fm m)) => Fuel -> fm m a -> m a Source

liftFuel :: (Monad m, FuelMonad (fm m)) => m a -> fm m a Source

Экземпляры

FuelMonadT InfiniteFuelMonad
FuelMonadT CheckingFuelMonad

data CheckingFuelMonad m a Source

Экземпляры

FuelMonadT CheckingFuelMonad
Monad m => Monad (CheckingFuelMonad m)
Monad m => Functor (CheckingFuelMonad m)
Monad m => Applicative (CheckingFuelMonad m)
CheckpointMonad m => CheckpointMonad (CheckingFuelMonad m)
UniqueMonad m => UniqueMonad (CheckingFuelMonad m)
Monad m => FuelMonad (CheckingFuelMonad m)
type Checkpoint (CheckingFuelMonad m) = (Fuel, Checkpoint m)

data InfiniteFuelMonad m a Source

Экземпляры

FuelMonadT InfiniteFuelMonad
Monad m => Monad (InfiniteFuelMonad m)
Monad m => Functor (InfiniteFuelMonad m)
Monad m => Applicative (InfiniteFuelMonad m)
CheckpointMonad m => CheckpointMonad (InfiniteFuelMonad m)
UniqueMonad m => UniqueMonad (InfiniteFuelMonad m)
Monad m => FuelMonad (InfiniteFuelMonad m)
type Checkpoint (InfiniteFuelMonad m) = Checkpoint m

type SimpleFuelMonad = CheckingFuelMonad SimpleUniqueMonad Source

type Unique = Int Source

intToUnique :: Int -> Unique Source

data UniqueSet Source

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

Eq UniqueSet
Ord UniqueSet
Show UniqueSet
IsSet UniqueSet
type ElemOf UniqueSet = Unique

data UniqueMap v Исходный код

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

IsMap UniqueMap
Eq v => Eq (UniqueMap v)
Ord v => Ord (UniqueMap v)
Show v => Show (UniqueMap v)
type Ключ UniqueMap = Unique

class Monad m => UniqueMonad m где Исходный код

Методы

freshUnique :: m Unique Исходный код

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

UniqueMonad SimpleUniqueMonad
Monad m => UniqueMonad (UniqueMonadT m)
UniqueMonad m => UniqueMonad (InfiniteFuelMonad m)
UniqueMonad m => UniqueMonad (CheckingFuelMonad m)

data SimpleUniqueMonad a Исходный код

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

Monad SimpleUniqueMonad
Functor SimpleUniqueMonad
Applicative SimpleUniqueMonad
CheckpointMonad SimpleUniqueMonad
UniqueMonad SimpleUniqueMonad
type Точка_контроля SimpleUniqueMonad = [Unique]

runSimpleUniqueMonad :: SimpleUniqueMonad a -> a Исходный код

data UniqueMonadT m a Исходный код

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

Monad m => Monad (UniqueMonadT m)
Monad m => Functor (UniqueMonadT m)
Monad m => Applicative (UniqueMonadT m)
Monad m => UniqueMonad (UniqueMonadT m)

runUniqueMonadT :: Monad m => UniqueMonadT m a -> m a Исходный код

uniqueToInt :: Unique -> Целое Исходный код

type Функция_отслеживания = forall a. Строка -> a -> a Исходный код

debugFwdJoins :: forall m n f. Show f => Функция_отслеживания -> ChangePred -> FwdPass m n f -> FwdPass m n f Исходный код

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

Наиболее распространённый случай использования, вероятно, следующий:

  1. импортировать Trace
  2. передать trace в качестве первого аргумента к комбинатору отладки
  3. передать 'const true' в качестве второго аргумента к комбинатору отладки

Существуют два типа сообщений отладки для объединения, в зависимости от того, выше ли объединение в решетке, чем старое значение факта: 1. Если объединение выше, мы покажем: + ОбъединениеL: f1 join f2 = f' where: + indicates a change L is the label where the join takes place f1 is the old fact at the label f2 is the new fact we are joining to f1 f' is the result of the join 2. _ JoinL: f2 <= f1 где: _ обозначает отсутствие изменений L — метка, где происходит объединение f1 — старое значение факта в метке (которое остаётся неизменным) f2 — новое значение факта, с которым мы объединили f1

debugBwdJoins :: forall m n f. Show f => Функция_отслеживания -> ChangePred -> BwdPass m n f -> BwdPass m n f Исходный код

debugFwdTransfers :: forall m n f. Show f => Функция_отслеживания -> ShowN n -> FPred n f -> FwdPass m n f -> FwdPass m n f Исходный код

debugBwdTransfers :: forall m n f. Show f => Функция_отслеживания -> ShowN n -> BPred n f -> BwdPass m n f -> BwdPass m n f Исходный код

showGraph :: forall n e x. NonLocal n => Showing n -> Graph n e x -> String Source

showFactBase :: Show f => FactBase f -> String Source

© 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/hoopl-3.10.0.2/Compiler-Hoopl.html

Spec-Zone.ru

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