<html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"></head><body style="overflow-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;">Indeed, this is <a href="https://gitlab.haskell.org/ghc/ghc/-/wikis/migration/9.6#transformers-06-new-monadtrans-quantified-context">included in the GHC 9.6.x Migration Guide</a>.<div><br></div><div>Unfortunately, I’m also not sure there is a solution for this particular where (T m) is only a Monad if m instances MonadIO.</div><div>As Tom explained, under transformers 0.6 `T` no longer is a monad transformer.</div><div><br></div><div>A few workarounds I can think of:</div><div><br></div><div>- No longer instance `MonadTrans T`, and use a instance `MonadIO m => MonadIO (T m)` instead.</div><div>  Rationale: if you always require `m` to be `MonadIO`, perhaps the ability to always lift an `m` to `T m` with `liftIO` is sufficient.</div><div><br></div><div>- Add the `MonadIO` instance to the `m` field of `T`, GADT style, `data T m a where T :: MonadIO m => m -> T m a`</div><div>  Rational: You would no longer need `MonadIO` in the `Monad` instance, which will make it possible to instance `MonadTrans`.</div><div><br></div><div>- Redefine your own `lift` regardless of `MonadTrans`</div><div><br></div><div>Good luck!</div><div>Rodrigo</div><div><div><div><br><blockquote type="cite"><div>On 12 Apr 2023, at 10:10, Tom Ellis <tom-lists-haskell-cafe-2017@jaguarpaw.co.uk> wrote:</div><br class="Apple-interchange-newline"><div><div>On Wed, Apr 12, 2023 at 02:32:43PM +0530, Harendra Kumar wrote:<br><blockquote type="cite">instance MonadIO m => Monad (T m) where<br>    return = pure<br>    (>>=) = undefined<br><br>instance MonadTrans T where<br>    lift = undefined<br></blockquote><br>I guess it's nothing to do with 9.6 per se, but rather the difference<br>between<br><br>* https://hackage.haskell.org/package/transformers-0.5.6.2/docs/Control-Monad-Trans-Class.html#t:MonadTrans<br><br>* https://hackage.haskell.org/package/transformers-0.6.1.0/docs/Control-Monad-Trans-Class.html#t:MonadTrans<br><br>I'm not sure I can see any solution for this.  A monad transformer `T`<br>must give rise to a monad `T m` regardless of what `m` is.  If `T m`<br>is only a monad when `MonadIO m` then `T` can't be a monad transformer<br>(under transformers 0.6).<br><br>Tom<br>_______________________________________________<br>ghc-devs mailing list<br>ghc-devs@haskell.org<br>http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs<br></div></div></blockquote></div><br></div></div></body></html>