
Do you want to mix differently typed Connections inside a single transaction? It looks like you don't, so you may well leave out existential types altogether and simply parametrize the Transaction monad on the type of the connection it uses.
data Connection c => TransactionState c = TS c data Transaction c a = Transaction (TransactionState c -> (a, TransactionState c)
instance Monad (Transaction c) where ...
getConnection :: Transaction c c ...
Note that Control.Monad.State does the same.
Regards, apfelmus
You are correct in that I don't want to mix different kind of connections inside a single transaction. I just didn't want to have to parameterize every single function using the monad. doSomething :: Transaction FirebirdConnection () doSomethingElse :: Transaction FirebirdConnection () Maybe I'm misunderstanding something but as I see it that would kind of stop me from running doSomething and doSomethingElse using different kinds of databases.