Hi Dmitry, It's pretty straightforward to use OverlappingInstances: class Runnable a b where run :: a -> b instance (r ~ (s -> (m (a,s)))) => Runnable (StateT s m a) r where run m = runStateT m instance (r ~ (s -> (a,s))) => Runnable (StateT s Identity a) r where run m = runState m Involving a type family doesn't simplify things, since you still need two class instances to choose between runStateT and runState. With TH you could avoid overlapping instances by looking at the names in (reify ''Monad) to replace the type variable `m' with a particular instance of Monad. In other words, with TH you can generate many many instances that look like: instance (r ~ (s -> (IO (a,s)))) => Runnable (StateT s IO a) r where run m = runStateT m instance (r ~ (s -> (ReaderT t (a,s)))) => Runnable (StateT s (ReaderT t) a) r where run m = runStateT m And then users that define their own instances of Monad would have run the same TH for Runnable to work. Is that the unpleasant scenario you mean by "even TH does not helps here"? Regards, Adam On Sat, May 24, 2014 at 10:53 AM, Dmitry Bogatov <KAction@gnu.org> wrote:
Hello! I am working on package to generalize common `runSomeThing` and `runSomethingT` functions.
It is very easy to generalize runStateT and runReaderT like
class Runnable a where type RunResult a run :: a -> RunResult a instance Runnable (StateT s m a) where --- Why ScopedTypeVariables do not work here? type RunResult (StateT s m a) = s -> m (a, s) run = runStateT --- ReaderT absolutely the same
But problem is that `State s a` is in fact `StateT s Identity a` and I get type family conflicts.
In fact, it boils down to following:
type family TestIdentity (m :: * -> *) type instance TestIdentity Identity = Int type instance TestIdentity m = () -- Anything but Identity.
In general, with all this TypeClass magic, I have a lot of ways that something belong to some class, and no (aside OverlappingInstances) to tell that it does NOT belong. I belive, there is reason to, but I do not see it. Also, seems even TH does not helps here.
PS. Please, keep me in To:
-- Best regards, Dmitry Bogatov <KAction@gnu.org>, Free Software supporter, esperantisto and netiquette guardian. git://kaction.name/rc-files.git GPG: 54B7F00D _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe