Примеры монадических эффектов внутри функции перезаписи в Hoopl?
Тип (перезаписывающих) функций перезаписи в Hoopl задается mkFRewrite
функция:
mkFRewrite :: (FuelMonad m) =>
(forall e x.
n e x
-> f
-> m (Maybe (hoopl-3.8.6.1:Compiler.Hoopl.Dataflow.Graph n e x)))
-> FwdRewrite m n f
m
Тип подразумевает, что я могу использовать монадические эффекты при переписывании. В документе "Обруч: модульная многоразовая библиотека для анализа и преобразования потока данных" говорится то же самое в разделе 4.3 "Функция перезаписи и монады клиента".
Может ли кто-нибудь дать мне пример функции перезаписи, в которую встроены не-Хопл монадические эффекты? Например, переписчик, который использует монаду State или выполняет какой-то ввод-вывод.
1 ответ
Это должно быть довольно просто, просто преследуйте типы.
Вы хотите значение FwdRewrite m n f
с пользовательским значением m
, так что вы можете передать его следующей функции:
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)
Так что единственным ограничением на m
у вас есть то, что это CheckpointMonad
; затем, когда вы запустите проход, вы получите окончательное монадическое значение, которое вы можете запустить самостоятельно.
На самом деле, GHC Hoopl проходит использование с m
как SimplUniqMonad
, так что мы можем получить новые метки, пока мы работаем над графиком.
{-# LANGUAGE TypeSynonymInstances #-}
{-# LANGUAGE TypeFamilies #-}
import Compiler.Hoopl
import Control.Monad.State
type StateFuel s a = CheckingFuelMonad (State s) a
instance CheckpointMonad (State s) where
type Checkpoint (State s) = s
checkpoint = get
restart = put