Strong version of 'local' for reader monad

Hi all, Today I wanted this function strongLocal :: (MonadReader r1 m1, MonadReader r2 m2) => (r2 -> r1) -> m1 a -> m2 a Of course, after staring at this type for ten seconds I realized that it cannot be implemented. But I wondered whether anyone has any pointers to anything related, or if anyone has good ideas for a reasonable interface that would allow this. -Brent

Hey Brent, Of course, because your type signature has no valid implementation, the expected semantics are hard to guess. Why should strongLocal bother about the MonadReader constraint on m1 anyway? Are you internally combining it with 'ask' or another 'local'? The monads are potentially different, so m1 has to be run inside m2. A more specific version of strongLocal could be: strongLocalReader :: MonadReader r2 m2 => (r2 -> r1) -> Reader r1 a -> m2 a strongLocalReader f m = do r <- asks f return (runReader m r) Or you can generalize it to every 'Runnable' monad: class Monad m => Runnable m where run :: m a -> a strongLocalRunnable :: (MonadReader r2 m2, Runnable m1) => (r2 -> r1) -> (r1 -> m1 a) -> m2 a strongLocalRunnable f m = do r <- asks f return (run (m r)) Is this what you want to express? Cheers, Sebastiaan On Dec 13, 2010, at 9:30 PM, Brent Yorgey wrote:
Hi all,
Today I wanted this function
strongLocal :: (MonadReader r1 m1, MonadReader r2 m2) => (r2 -> r1) -> m1 a -> m2 a
Of course, after staring at this type for ten seconds I realized that it cannot be implemented. But I wondered whether anyone has any pointers to anything related, or if anyone has good ideas for a reasonable interface that would allow this.
-Brent

On Mon, Dec 13, 2010 at 9:30 PM, Brent Yorgey
Hi all,
Today I wanted this function
strongLocal :: (MonadReader r1 m1, MonadReader r2 m2) => (r2 -> r1) -> m1 a -> m2 a
Of course, after staring at this type for ten seconds I realized that it cannot be implemented. But I wondered whether anyone has any pointers to anything related, or if anyone has good ideas for a reasonable interface that would allow this.
Here's a draft by Bruno Oliveira and me on manipulating the monad stack. The examples in Section 4.3 on p.12-13 are related: http://users.ugent.be/~tschrijv/Research/papers/virtual_monad_stack.pdfhttp://users.ugent.be/%7Etschrijv/Research/papers/virtual_monad_stack.pdf
participants (3)
-
Brent Yorgey
-
Sebastiaan Visser
-
Tom Schrijvers