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的重写器.
最佳答案 这应该很简单,只需追逐类型即可.
您想要一个自定义值为m的FwdRewrite 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)
因此,你所拥有的唯一约束是它是一个CheckpointMonad;然后当你运行传球时,你将获得最终的monadic值,你可以自己运行.
事实上,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