Как я могу объединить CheckingFuelMonad с монадой State в Hoopl?

Я использую библиотеку Hoopl и хотел бы перенести какое-то состояние при перезаписи. Функции перезаписи полиморфны в отношении используемой монады, но я не могу понять, как объединить монаду State с одной из библиотечных монад Fuel .

Ниже приведен минимальный пример. MyMonad - синоним, объединяющий монаду Hoopl CheckingFuelMonad и монаду состояния , несущую флаг. Stmt - это просто заполнитель для моего промежуточного языка и не очень важен.

{-# LANGUAGE GADTs, RankNTypes #-}

import Compiler.Hoopl
import Control.Monad.State

type MyMonad = CheckingFuelMonad (State Bool)

data Stmt e x where
  Bind :: () -> Stmt O O

rewriter :: forall e x. Stmt e x -> Fact x () -> MyMonad (Maybe (Graph Stmt e x))
rewriter (Bind ()) () = return $ do
  f <- get
  if f 
   then return $ Just emptyGraph
   else return Nothing

Но это не скомпилируется - GHC жалуется, что rewrite имеет неправильный тип:

Couldn't match expected type `Graph' Block Stmt e x'
       against inferred type `Maybe (g n O O)'
  Expected type: CheckingFuelMonad
                   (State Bool) (Maybe (Graph Stmt e x))
  Inferred type: CheckingFuelMonad
                   (State Bool) (Maybe (Maybe (g n O O)))

Возможно ли то, что я хочу сделать? Как мне правильно написать функцию rewrite ?

7
задан sth 20 August 2011 в 19:04
поделиться