Я использую библиотеку 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
?