Примеры монадических эффектов внутри функции перезаписи в 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 Тип подразумевает, что я могу использовать монадические эффекты при переписывании. В документе "Обруч: модульная многоразовая библиотека для анализа и преобразования потока данных" говорится то же самое в разделе 4.3 "Функция перезаписи и монады клиента".

Может ли кто-нибудь дать мне пример функции перезаписи, в которую встроены не-Хопл монадические эффекты? Например, переписчик, который использует монаду State или выполняет какой-то ввод-вывод.

1 ответ

Решение

Это должно быть довольно просто, просто преследуйте типы.

Вы хотите значение 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 проходит использование с 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
Другие вопросы по тегам