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
类型意味着我可以在重写时使用monadic效果。论文"Hoopl: A Modular, Reusable Library for Dataflow Analysis and Transformation"在第4.3节“重写函数和客户端的monad”中也是如此。
有人能给我一个重写函数的例子,其中嵌入了非Hoopl monadic效果吗?例如,使用State monad或执行某些IO的重写器。
答案 0 :(得分:2)
这应该很简单,只需追逐类型。
您希望值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
的唯一约束是m
;然后当你运行传球时,你将获得最终的monadic值,你可以自己运行。
事实上,GHC的Hoopl使用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
,因此我们可以在图表上运行时获得新标签。
{{1}}