私はHooplライブラリを使用しており、書き換え中に何らかの状態を保持したいと考えています。State
書き換え関数は、使用されるモナドに関してポリモーフィックですが、モナドをライブラリのモナドの 1 つと組み合わせる方法がわかりませんFuel
。
以下は最小限の例です。MyMonad
HooplCheckingFuelMonad
とフラグを持つState
モナドを組み合わせたシノニムです。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
しかし、これはコンパイルされません -- GHCrewrite
は間違った型を持っていると文句を言います:
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
関数を正しく記述するにはどうすればよいですか?