[Haskell-cafe] MonadPeelIO instance for monad transformers on top of "forall"
Anders Kaseorg
andersk at MIT.EDU
Sat Feb 5 00:29:17 CET 2011
On Fri, 4 Feb 2011, Max Bolingbroke wrote:
> On 4 February 2011 21:41, Anders Kaseorg <andersk at mit.edu> wrote:
> > On Fri, 4 Feb 2011, Max Bolingbroke wrote:
> >> data M a = M { unM :: forall m. MonadPeelIO m => Reader.ReaderT () m a }
> >
> > Maybe this won’t help in your actual code, but isn’t M isomorphic to IO
> > (via unM :: M a -> IO a, M . liftIO :: IO a -> M a)?
>
> Well, yes :-). My real code actually has a non-trivial ReaderT
> transformer and a StateT transformer it reaches "m". I had hoped that
> by restricting to ReaderT () the problem would be simpler and hence
> clearer.
Oh sorry, I further simplified your problem by stripping off the ReaderT
() and forgot to undo that before sending my reply. Pretend that I sent
the following instead: :-)
Maybe this won’t help in your actual code, but isn’t M isomorphic to
ReaderT () IO (via unM :: M a -> ReaderT () IO a, M . mapReaderT liftIO ::
IO a -> M a)?
instance MonadPeelIO M where
peelIO = M (mapReaderT liftIO (liftM (\k (M mx) -> liftM (\my -> (M (mapReaderT liftIO my))) (k mx)) peelIO))
> Is this definition trying to exploit the isomorphism, or do you think
> that this is a solution to the general class of problems I'm having
> trouble with?
It does exploit the isomorphism. I’m not sure whether the isomorphism
will generalize to your case; I assume there’s probably some reason you
have a polymorphic type instead of replacing it with an equivalent
nonpolymorphic type?
Anders
More information about the Haskell-Cafe
mailing list