Ну, непосредственная причина вашей текущей ошибки проста. Каково окончательное выражение, если f
верно? Если мы возьмем это:
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
... и удалите все, кроме True
ветви, которую мы получим:
rewriter :: forall e x. Stmt e x -> Fact x () -> MyMonad (Maybe (Graph Stmt e x))
rewriter (Bind ()) () = return $ do
return $ Just emptyGraph
... что упрощает до:
rewriter :: forall e x. Stmt e x -> Fact x () -> MyMonad (Maybe (Graph Stmt e x))
rewriter (Bind ()) () = return $ return $ Just emptyGraph
Какой тип return $ return $ Just emptyGraph
?
(Monad m1, Monad m2, GraphRep g) => m1 (m2 (Maybe (g n O O)))
Другими словами, у вас есть дополнительный return
там. (Monad m) => CheckingFuelMonad m
сам по себе Monad
, хотя CheckingFuelMonad
, похоже, не определяется как преобразователь монад, поэтому у вас есть только один слой монад на return
с.