Parameterized monad transformers

Howdy y'all! I was reading sigfpe's Beyond Monads post (http://blog.sigfpe.com/2009/02/beyond-monads.html) about parameterized monads. Great post, makes you go: this is so elegant and simple, why didn't I think of that? Anyway, I was wondering whether those monads have corresponding transformers, and if so, what they look like and what they are good for? Is there any weight to the idea at all? I don't know much about monad transformer theory, but I do imagine that for transformers to be useful, they have to be stackable, so the underlying monad of a parameterized monad also has to be a parameterized monad. I asked around in #haskell and ski_ and I had a couple of ideas exploring the concept (although he did most of the exploring, I just carried his luggage). Seeing how parameterized monads are gotten by just loosening some restrictions on normal ones and drawing then parallels between them, I think the same methodology could be applied to transformers. So there should be a transformer version t of a parameterized monad m and a lifting operation plift that lifts m to t. At first I did what sigfpe did with non-transformer monads, which was to just implement the appropriate functions for the more general monads and see what GHCI tells us about the type. I first thought about having a parameterized StateT, PStateT: newtype PStateT m s1 s2 a = PStateT { runPStateT :: s1 -> m (a, s2) } along with a lifting operation plift :: (PMonad m) => m s1 s2 a -> t (m s1 s2) s3 s3 a but I don't think that's cool because of the different kind of the underlying monad. So then ski_ suggested newtype PStateT m (s1,s1') (s2,s2') a = PStateT { runPStateT :: s1 -> m s1' s2' (Pair a s2) } where (s1,s1') and (s2,s2') stand for the pair of types and not a (,) type constructor with two types applied as type parameters. That's why the pair in the result is represented as Pair a s2. Anyway, s1' and s2' represent the category tail and head of the underlying parameterized monad. With that, the lifting operation would have a type of plift :: (PMonad pm) => pm s1 s2 a -> t pm (s, s1) (s, s2) a basically I'm just wondering how you guys think the transformer versions of parameterized monads work and what their types should be. And if you think they're feasible at all. So basically just talk about parameterized monad transformers here :] Cheerio!

Also, maybe the lifting operation could be plift :: (PMonad m) => m s1 s2 a -> t m s1 s2 s s a where s1 and s2 are passed to the underlying type constructor. That way, the kind of m would be * -> * -> * -> * and the kind of t would be (* -> * -> * -> *) -> * -> * -> * -> * -> * -> * so we see how if we apply the first three types we get * -> * -> * -> *, which is the kind of m. Just thinking out loud basically :] Cheerio! - BONUS
participants (2)
-
Miran Lipovaca
-
Miran Lipovača