
21 Nov
2006
21 Nov
'06
12:35 p.m.
"David House"
* 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. Regards, Malcolm