używam biblioteki Hoopl i chciałby mieć przy sobie stan się podczas przepisywania. Funkcje przepisujące są polimorficzne dotyczące monady używane, ale nie mogę dowiedzieć się, jak połączyć State
monady z jednym z biblioteki Fuel
monad.Jak mogę połączyć CheckingFuelMonad z Monadą Stanową w Hoopl?
Poniżej jest przykład minimalny. MyMonad
jest synonimem łączącym monadę Hoopla z CheckingFuelMonad
i State
niosącą flagę. Stmt
jest tylko symbolem zastępczym dla mojego języka pośredniego i nie jest tak naprawdę ważny.
{-# 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
Ale nie będzie to skompilować - GHC zarzuca rewrite
ma niewłaściwy typ:
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)))
jest to, co chcę zrobić, to możliwe? Jak poprawnie napisać funkcję rewrite
?
jestem bardzo przekonany, że ten tekst poprawiony jest dźwięk. To bardzo ryzykowny biznes. –