
Malcolm Wallace wrote:
Taral
writes: On 11/20/06, Malcolm Wallace
wrote: newtype Wrapper a = Wrap a convert :: [a] -> [Wrapper a] convert xs = map Wrap xs
Interesting! Looks like the compiler lacks rules for optimizing "map id" &c.\
And not all compilers have optimisation phases.
Your coercion does assume that the underlying runtime doesn't have some kind of type-tag implementation of type classes.
I believe this is guaranteed by the definition of newtype in the Language Report.
The language doesn't say anything about the runtime representation of newtype. It so happens that the semantics lead to the obvious implementation of a newtype as a type cast (that was the reason for introducing newtype, after all), but there's nothing to say you have to implement it this way. It would be wrong to require that unsafeCoerce let you convert between a newtype and its underlying type across implementations. Cheers, Simon