haskell – Hoopl中重写函数内部的monadic效果示例?

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
点赞