[Haskell-cafe] OOP'er with (hopefully) trivial questions.....

Wolfgang Jeltsch g9ks157k at acme.softbase.org
Mon Dec 17 14:06:23 EST 2007


Am Montag, 17. Dezember 2007 19:26 schrieb Tim Chevalier:
> On 12/17/07, Evan Laforge <qdunkan at gmail.com> wrote:
> > I'm sure there's a trivial explanation for this, but here's something
> > that I've always kind of wondered about:  Given a single constructor
> > type like "data X = X A B C" can't that be transformed into "newtype X
> > = X (A, B, C)"?  There must be some difference, because if there
> > weren't we could transform all single constructor types that way, and
> > dispense with newtype entirely.
>
> Strictness. In newtype X = X A, the A field is strict. In data X = X
> A, the A field is lazy. So the compiler can't just turn all
> single-constructor "data" types into "newtypes".

Evan talked about data constructors with multiple fields, not with one single 
field.

> (To generalize, if you were going to allow newtypes like
> "newtype X = X (A, B, C)", the tuple would be unboxed, and you'd have the
> same strictness/laziness distinction.)

This is not a generalization of what you talked about.  Why should the tuple 
type be unboxed?  Tuple types are boxed, meaning there is a difference 
between _|_ and (_|_,…,_|_).  If you write

    newtype X = X (A, B, C)

then X doesn’t add another level of indirection but the level of indirection 
introduced by the tuple constructor remains, of course.  So you could write 
the above newtype declaration instead of

    data X = X A B C.

_|_ would then be represented as X _|_ (equal to _|_) and X _|_ _|_ _|_ as
X (_|_,_|_,_|_).  Instead of pattern matching against X a b c, you would have 
to pattern match against X (a,b,c).

So why not use the above newtype declaration instead of multi-field data 
declarations?  One strong reason is that tuple types are itself algebraic 
data types which could be defined by data declarations if they wouldn’t use 
special syntax.  So we would have to represent a tuple type by a newtype 
whose field type would be the tuple type we just want to represent.

> […]

> Cheers,
> Tim

Best wishes,
Wolfgang


More information about the Haskell-Cafe mailing list