Tue, 15 Jan 2002 14:39:35 -0800
Well, I guess I was wrong about this. I was confused by the place where the
Haskell Report says:
Unlike algebraic datatypes, the newtype constructor N is unlifted, so
that N _|_ is the same as _|_.
What I didn't realize was that matching against N is irrefutable. What I still
don't understand is _why_ it is irrefutable. How (if at all) does this make them
more efficient? In particular, it seems it would be possible to simulate the
newtype with a datatype:
The report says that if
data D2=D2 !Int
newtype N = N Int
d2 (D2 i) = 42
n (N i) = 42
d2 _|_ = _|_ d2 (D2 _|_) = _|_
n _|_ = 42 n (N_|_) = 42
If d2 were rewritten
d2' ~(D2 i) = 42
then it would act just like n.
I guess the question is whether the code for d2' is as efficient as the code for
n. I don't see why it wouldn't be, but of course I could be wrong.