Coercible questions

Michal Terepeta michal.terepeta at gmail.com
Sat Oct 5 16:29:55 UTC 2019


Adding +ghc-devs <ghc-devs at haskell.org> to continue the thread

Hi Sandy,

Thanks for the answer! Do you think there is some fundamental reason for
this? Or just a matter of implementing this in GHC? It seems to me that
this should work just fine as long as the runtime representation is the
same.

And a related question--is it safe to `unsafeCoerce` an `Int` to a `Word`?
The only reason for why this could be problematic that comes to my mind is
that there could be an assumption that different `data`s do not alias each
other (although `newtype`s can due to `Coercible` functionality). But I'm
not sure this is ever used by GHC? Are there any other reasons why this
could be problematic?

Thanks!

- Michal



On Sat, Oct 5, 2019 at 5:27 PM Sandy Maguire <sandy at sandymaguire.me> wrote:

> Hi Michal,
>
> Datas aren't coercible, only newtypes. This is why you can't coerce Ints
> and Words, and why Foo and Bar don't work.
>
> Sandy
>
> On Sat, Oct 5, 2019 at 4:17 PM Michal Terepeta <michal.terepeta at gmail.com>
> wrote:
>
>> Hi,
>>
>> I've started looking into using `Data.Coerce` (and the `Coercible`
>> type-class) for a personal project and was wondering why coercing between
>> `Int` and `Word` is not allowed? I don't see any fundamental reason why
>> this shouldn't work...
>>
>> Perhaps, it's just a matter of GHC's implementation details leaking out?
>> IIRC internally GHC has separate `RuntimeRep`/`PrimRep` for a `Word#` and
>> for an `Int#`. If that's the case, would it make sense to unify these?
>> Their actual runtime representation should be the same and I'd expect most
>> (all?) of their differences should be attached to `PrimOp`s.
>>
>> And that leads me to another question--what exactly goes wrong here:
>> ```
>> data Foo = Foo Int#
>> data Bar = Bar Int#
>>
>> test :: Bar
>> test = coerce (Foo 42#)
>> ```
>> Which fails with: "Couldn't match representation of type ‘Foo’ with that
>> of ‘Bar’ arising from a use of ‘coerce’"
>>
>> Perhaps I'm just misunderstanding exactly how `Coercible` works?
>>
>> Thanks in advance!
>>
>> - Michal
>>
>> PS. The ability to coerce through things like lists is amazing :)
>> _______________________________________________
>> ghc-devs mailing list
>> ghc-devs at haskell.org
>> http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs
>>
>
>
> --
> I'm currently travelling the world, sleeping on people's couches and doing
> full-time collaboration on Haskell projects. If this seems interesting to
> you, please consider signing up as a host!
> https://isovector.github.io/erdos/
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/ghc-devs/attachments/20191005/319147f2/attachment.html>


More information about the ghc-devs mailing list