GHC 9.6.1 rejects previously working code

Harendra Kumar harendra.kumar at gmail.com
Wed Apr 12 09:42:26 UTC 2023


Thanks Tom and Rodrigo.

That clarifies the problem. We will need to think which solution makes
better sense.

On Wed, 12 Apr 2023 at 15:01, Rodrigo Mesquita <rodrigo.m.mesquita at gmail.com>
wrote:

> Indeed, this is included in the GHC 9.6.x Migration Guide
> <https://gitlab.haskell.org/ghc/ghc/-/wikis/migration/9.6#transformers-06-new-monadtrans-quantified-context>
> .
>
> Unfortunately, I’m also not sure there is a solution for this particular
> where (T m) is only a Monad if m instances MonadIO.
> As Tom explained, under transformers 0.6 `T` no longer is a monad
> transformer.
>
> A few workarounds I can think of:
>
> - No longer instance `MonadTrans T`, and use a instance `MonadIO m =>
> MonadIO (T m)` instead.
>   Rationale: if you always require `m` to be `MonadIO`, perhaps the
> ability to always lift an `m` to `T m` with `liftIO` is sufficient.
>
> - Add the `MonadIO` instance to the `m` field of `T`, GADT style, `data T
> m a where T :: MonadIO m => m -> T m a`
>   Rational: You would no longer need `MonadIO` in the `Monad` instance,
> which will make it possible to instance `MonadTrans`.
>
> - Redefine your own `lift` regardless of `MonadTrans`
>
> Good luck!
> Rodrigo
>
> On 12 Apr 2023, at 10:10, Tom Ellis <
> tom-lists-haskell-cafe-2017 at jaguarpaw.co.uk> wrote:
>
> On Wed, Apr 12, 2023 at 02:32:43PM +0530, Harendra Kumar wrote:
>
> instance MonadIO m => Monad (T m) where
>    return = pure
>    (>>=) = undefined
>
> instance MonadTrans T where
>    lift = undefined
>
>
> I guess it's nothing to do with 9.6 per se, but rather the difference
> between
>
> *
> https://hackage.haskell.org/package/transformers-0.5.6.2/docs/Control-Monad-Trans-Class.html#t:MonadTrans
>
> *
> https://hackage.haskell.org/package/transformers-0.6.1.0/docs/Control-Monad-Trans-Class.html#t:MonadTrans
>
> I'm not sure I can see any solution for this.  A monad transformer `T`
> must give rise to a monad `T m` regardless of what `m` is.  If `T m`
> is only a monad when `MonadIO m` then `T` can't be a monad transformer
> (under transformers 0.6).
>
> Tom
> _______________________________________________
> ghc-devs mailing list
> ghc-devs at haskell.org
> http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs
>
>
> _______________________________________________
> ghc-devs mailing list
> ghc-devs at haskell.org
> http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/ghc-devs/attachments/20230412/0b383185/attachment.html>


More information about the ghc-devs mailing list