fre 2002-01-25 klockan 02.21 skrev Feuer:
Please reply to dfeuer@cs.brown.edu
I don't remember if I answered this before, but...
I don't see the relevance of there being no constructor to match on. That is the case for any tuple type. It seems that
newtype T1 [a1 a2 ...] = C1 ... is the same as data T2 [a1 a2 ...] = C2 !... !... !...
Except that pattern matching on C1 is like lazy pattern matching on C2. Since newtype is supposed to be about efficiency, I am trying to understand what makes this more efficient. I have not yet seen any explanation of this.
Those two constructs are not the same Compare newtype T1 = C1 Bool data T2 = C2 !Bool the difference is that the constructor C1 does not exist, so only the following values exist for T1: C1 True (which is the represented as True) C1 False (which is the represented as False) C1 _|_ (which is represented as non-termination or error) however, for T2, another value exist, namely _|_. So, pattern matching on (T2 x) may fail it the value is _|_. You are right that semantically newtype is the same as always matching lazily on the constructor. The case for a tuple type (a,b,c) for instance, is different. Here there is a constructor, you can even type it by itself, it is (,,), try ":t (,,)" in hugs or ghci. Chapter 4.2.3 in the Haskell 98 report clarifies this. Regards, Martin