Hoopl kitaplığını kullanıyorum ve yeniden yazarken bazı durumları taşımak istiyorum. Yeniden yazma işlevleri kullanılan monad ile ilgili polimorfiktir, ancak bir State
monadını kütüphanenin Fuel
monad'larından biriyle nasıl birleştireceğimi anlayamıyorum.CheckingFuelMonad'ı Hoopl'da bir devlet monadıyla nasıl birleştirebilirim?
Aşağıda minimal bir örnek verilmiştir. MyMonad
, Hoopl'un CheckingFuelMonad
ve bir bayrağı taşıyan bir State
monadını bir araya getiren bir eşanlamlıdır. Stmt
aramam için bir yer tutucudur ve gerçekten önemli değildir.
{-# 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
Ama bu derlemek olmaz - GHC rewrite
yanlış türe sahip yakınıyor:
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)))
Mümkün yapmak istediğim şey var mı? rewrite
işlevini nasıl doğru yazabilirim?
Bu yeniden yazmanın sağlam olduğuna inanıyorum. Bu çok tehlikeli bir iş. –