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.mesqu...@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-2...@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@haskell.org
    http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs

    _______________________________________________
    ghc-devs mailing list
    ghc-devs@haskell.org
    http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs


_______________________________________________
ghc-devs mailing list
ghc-devs@haskell.org
http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs
_______________________________________________
ghc-devs mailing list
ghc-devs@haskell.org
http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs

Reply via email to