私はHooplライブラリを使用しており、書き換え中に何らかの状態を保持したいと考えています。書き換え関数は使用されているモナドに関する多型ですが、State
モナドとライブラリのFuel
モナドのいずれかをどのように組み合わせるか分かりません。CheckingFuelMonadとHooplのStateモナドを組み合わせるにはどうすればいいですか?
以下は最小の例です。 MyMonad
は、フープのCheckingFuelMonad
とフラグを持っている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
しかし、これはコンパイルされません - 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
関数を正しく書くにはどうすればよいですか?
私はこの書き換えが健全であることを納得していません。これは非常に厄介なビジネスです。 –