
On Sat, Oct 16, 2004 at 10:19:14AM +0900, Koji Nakahara wrote:
On Fri, 15 Oct 2004 19:55:02 -0400 Andrew Pimlott
wrote: data Foo = forall t. (MonadTrans t) => Foo ((Monad m, Monad (t m)) => t m a -> m a) -- run ((Monad m, Monad (t m)) => t m Int) -- op
prog :: Foo -> IO Int prog (Foo run op) = run $ do lift $ putStrLn "Running prog" op
ghci gives the error
Could not deduce (Monad (t IO)) from the context (MonadTrans t) arising from use of `op' at try.hs:22
Your prog leaks m (= IO) out of Foo. I guess you mean:
data Foo m = forall t. (MonadTrans t, Monad (t m)) => Foo (forall a. t m a -> m a) (t m Int)
prog :: Foo IO -> IO Int prog (Foo run op) = run $ do lift $ putStrLn "Running prog" op
test = prog (Foo (flip evalStateT 0) get)
But my implementation may look like myFoo :: Int -> Foo myFoo i = Foo run op where run :: Monad m => StateT Int m a -> m a run prog = do (a, s) <- runStateT prog i return a op :: Monad m => StateT Int m Int op = get which works for all monads, not just IO (that is the idea of using a tranformer). So I really don't want to encode that type in Foo. Andrew