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 Источник
Предоставляет доступ к точкам закрепления для внелокальных рёбер, а также к самим рёбрам
Методы
Создание графов
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] Исходный код
Примеры
Формы
data O Исходный код
Используется на уровне типов для обозначения «открытой» структуры с уникальной, безымянной ветвью потока управления, входящей или выходящей. Разрешено «проваливание» и конкатенация в открытой точке.
data C Исходный код
Используется на уровне типов для обозначения «закрытой» структуры, которая поддерживает передачу управления только с помощью именованных меток — «проваливание» запрещено. Количество веток потока управления не ограничено.
Примеры использования
Тип Maybe, индексированный по открытым/закрытым значениям
Тип Maybe, индексированный по закрытым/открытым значениям
type family IndexedCO ex a b :: * Source
Тип Either, индексированный по закрытым/открытым значениям, используя типы семейств
Значение динамической формы
Блоки
Последовательность узлов. Может иметь одну из четырёх форм (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 |
Предикаты для блоков
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
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 Источник
Создать граф, определяющий метку.
Аргументы
| :: HooplNode n | |
| => (Label -> Label -> AGraph n O C) | условие цикла |
| -> AGraph n O O | тело цикла |
| -> AGraph n O O | окончательный цикл while |
class IfThenElseable x where 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 и возвращает граф с одним входом и двумя выходами, которые выходят на две метки.
Примеры
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, что может быть непонятно новичкам и раздражать экспертов.
Методы
setMember :: ElemOf set -> set -> Bool 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
setInsertList :: IsSet set => [ElemOf set] -> set -> set Source
setDeleteList :: IsSet set => [ElemOf set] -> set -> set 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
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
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
Реализации
data DataflowLattice a Source
Функция перевода может использовать флаг регистрации для управления отладкой, как, например, при обновлении только одного элемента в большом конечном отображении. Мы не хотим, чтобы Hoopl показывал весь факт, и только функция перевода знает точно, что изменилось.
type JoinFun a = Label -> OldFact a -> NewFact a -> (ChangeFlag, a) Источник
Конструкторы
| OldFact a |
Конструкторы
| NewFact a |
type family Fact x f :: * Источник
mkFactBase :: forall f. DataflowLattice f -> [(Label, f)] -> FactBase f Источник
mkFactBase создаёт FactBase из списка пар (Label, факт). Если одна и та же метка появляется более одного раза, соответствующие факты объединяются.
data ChangeFlag Источник
Конструкторы
| NoChange | |
| SomeChange |
Примеры
changeIf :: Bool -> ChangeFlag Источник
Конструкторы
| FwdPass | |
Поля
| |
newtype FwdTransfer n f Источник
Конструкторы
| FwdTransfer3 | |
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 | |
Поля
| |
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 Источник
Аргументы
| :: (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' |
Аргументы
| :: (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 |
Конструкторы
| BwdPass | |
Поля
| |
newtype BwdTransfer n f Источник
Конструкторы
| BwdTransfer3 | |
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 Источник
Аргументы
| :: (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' |
Аргументы
| :: (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 | |
Поля
| |
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, возвращать функцию, которая не уважает топливо.
freshLabel :: UniqueMonad m => m Label Source
Экземпляры
Экземпляры
type FactBase f = LabelMap 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 могут использоваться полиморфно.
Примеры реализации
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
fuelRemaining :: FuelMonad m => m Fuel Source
Узнайте, сколько топлива осталось после вычисления. Может быть вычтено из начального количества топлива для получения общего потребления.
withFuel :: FuelMonad m => Maybe a -> m (Maybe a) Source
class Monad m => FuelMonad m where 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
Экземпляры
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
intToUnique :: Int -> Unique Source
Примеры реализации
data UniqueMap v Исходный код
Примеры реализации
class Monad m => UniqueMonad m где Исходный код
Методы
Примеры реализации
| UniqueMonad SimpleUniqueMonad | |
| Monad m => UniqueMonad (UniqueMonadT m) | |
| UniqueMonad m => UniqueMonad (InfiniteFuelMonad m) | |
| UniqueMonad m => UniqueMonad (CheckingFuelMonad m) |
data SimpleUniqueMonad a Исходный код
Примеры реализации
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 Исходный код
Комбинаторы отладки: Каждый комбинатор берёт проход по потоку данных и создаёт проход по потоку данных, который может выводить сообщения отладки. Вы предоставляете функцию, мы вызываем её с соответствующим сообщением.
Наиболее распространённый случай использования, вероятно, следующий:
- импортировать
Trace - передать
traceв качестве первого аргумента к комбинатору отладки - передать '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