GHC 9.6.1 rejects previously working code

Georgi Lyubenov godzbanebane at gmail.com
Tue Apr 25 06:38:59 UTC 2023


Out of curiosity, why do you require the `MonadIO` on the `Monad` instance?

On 4/12/23 12:42, Harendra Kumar wrote:
> 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
>
>
> _______________________________________________
> 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/20230425/f6e23d33/attachment.html>


More information about the ghc-devs mailing list