4

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タイプは、書き換え中にモナディック効果を使用できることを意味します。論文「Hoopl:データフロー分析と変換のためのモジュール式で再利用可能なライブラリ」は、セクション4.3「書き換え関数とクライアントのモナド」で同じことを述べています。

非Hooplモナディック効果が埋め込まれている書き換え関数の例を教えてもらえますか?たとえば、Stateモナドを使用したりIOを実行したりするリライター。

4

1 に答える 1

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;であるということです。次に、パスを実行すると、自分で実行できる最終的なモナディック値が得られます。

実際、GHCのHooplパスはwithを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
于 2011-07-04T13:55:52.343 に答える