Coercible questions

Michal Terepeta michal.terepeta at
Sat Oct 5 14:16:58 UTC 2019


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 :)
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <>

More information about the ghc-devs mailing list