proposal: add 'unsafeCoerce'

Malcolm Wallace Malcolm.Wallace at
Tue Nov 21 12:35:12 EST 2006

"David House" <dmhouse at> wrote:

> >  * cast that changes a phantom type, or changes a type that is not
> >    reflected by a part of the value,
> >    eg. 'unsafeCoerce (Left 3) :: Either Int a' should be fine for
> >    any 'a',
> Couldn't we have the following for this case?
> castEitherL :: Either a b -> Either a c
> castEitherL (Left x) = Left x
> castEitherL z = z
> castEitherR :: Either a b -> Either c b
> castEitherR (Right x) = Right x
> castEitherR z = z

No actually.  Try it!  Any compiler will reject the catch-all cases
('z') because you are asking for the usage of z on the rhs to be at a
different type than the pattern usage of z on the lhs.


More information about the Libraries mailing list