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

时间:2011-07-01 15:30:39

标签: haskell compiler-construction monads dataflow 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类型意味着我可以在重写时使用monadic效果。论文"Hoopl: A Modular, Reusable Library for Dataflow Analysis and Transformation"在第4.3节“重写函数和客户端的monad”中也是如此。

有人能给我一个重写函数的例子,其中嵌入了非Hoopl monadic效果吗?例如,使用State monad或执行某些IO的重写器。

1 个答案:

答案 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)

因此mCheckpointMonad的唯一约束是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}}