Re: Soundness of forall mixed with Coercible

Zemyla <[email protected]> Fri, 12 Dec 2025 08:03:53 -0600
Newsgroups gmane.comp.lang.haskell.cafe
Message-ID <CAK7nUji0d9WoBkXdux31O0YK2an=FX2unnnokcouG5CWbnpKrA@mail.gmail.com>
Wouldn't the only inhabited value of Forall [] be []?

On Fri, Dec 12, 2025, 02:18 Adam Gundry <[email protected]> wrote:

> Hi Tom,
>
> You may be interested in a ticket where a similar issue was discussed
> before: https://gitlab.haskell.org/ghc/ghc/-/issues/20048
>
> Given `forall a . Coercible (f a) (g a)` it seems intuitively obvious
> that it should be sound to derive `Coercible f g`, but Core's typing
> rules don't currently allow it. Since Core is proof irrelevant it is
> probably safe just to add it, but actually proving soundness would take
> a bit of work.
>
> That said, you are asking about the subtly different
>
>      Coercible (forall a . f a) (forall a . g a)
>
> which is derivable from `Coercible f g`, but in fact I think is also
> derivable from `forall a. Coercible (f a) (g a)` in today's Core type
> system. The difficulty seems to be that GHC's constraint solver for
> equality/Coercible constraints is incomplete in the presence of
> quantified constraints. So unsafeCoerce seems defensible in this case.
>
> Cheers,
>
> Adam
>
>
> On 11/12/2025 17:58, Tom Ellis wrote:
> > Oh, I forgot to give the definition of Forall, so I may as well define
> > it in its full glory, imports, extensions and all:
> >
> > {-# LANGUAGE QuantifiedConstraints #-}
> >
> > import Data.Coerce (Coercible)
> > import Data.Type.Coercion (Coercion (Coercion))
> > import GHC.Exts (Any)
> > import Unsafe.Coerce (unsafeCoerce)
> >
> > newtype Forall f = MkForall (forall a. f a)
> >
> > forallCoercible ::
> >    forall f g.
> >    (forall a. Coercible (f a) (g a)) =>
> >    Coercion (Forall f) (Forall g)
> > forallCoercible =
> >    unsafeCoerce (Coercion @(f Any) @(g Any))
> >
> > On Thu, Dec 11, 2025 at 05:47:25PM +0000, Tom Ellis wrote:
> >>      forallCoercible ::
> >>        forall f g.
> >>        (forall a. Coercible (f a) (g a)) =>
> >>        Coercion (Forall f) (Forall g)
> >>      forallCoercible =
> >>        unsafeCoerce (Coercion @(f Any) @(g Any))
>
> --
> Adam Gundry, Haskell Consultant
> Well-Typed LLP, https://www.well-typed.com/
>
> Registered in England & Wales, OC335890
> 27 Old Gloucester Street, London WC1N 3AX, England
> _______________________________________________
> Haskell-Cafe mailing list -- [email protected]
> To (un)subscribe, modify options or view archives go to:
> Only members subscribed via the mailman list are allowed to post.
>

_______________________________________________
Haskell-Cafe mailing list -- [email protected]
To (un)subscribe, modify options or view archives go to:
Only members subscribed via the mailman list are allowed to post.