[Haskell-cafe] computational overhead of the "data" declarations

Brent Yorgey byorgey at seas.upenn.edu
Tue Oct 28 16:08:27 EDT 2008


On Tue, Oct 28, 2008 at 12:13:11PM -0700, Daryoush Mehrtash wrote:
> I Haskell School of Expression  (p172), it says:
> 
> A newtype declaration is just like a data declaration, except that it can
> > only be used to defined data types with single constructor.  The new data
> > type is different from the analogous one created by a data declaration, in
> > that there is no computational overhead in having the constructor.... You
> > can think of a newtype as defining  a "new type" with exactly the same
> > structure, behaviour, and performance as the underlying type.
> >
> 
> 
> What is (or where do you see) the computational overhead of the "data"
> declrations?

Consider the data declaration

  data Foo = Bar Int | Baz Char String

When a value of type Foo is stored in memory, there will actually be
some memory set aside for the tag (either Bar or Baz) since pattern
matching may need to be performed at runtime.  This is different from
a C union type, where if you want such a tag you must store it
yourself.

However, consider

  data Bad = Bad Int

Some memory will still be set aside to hold the 'Bad' tag, although in
this case we can see that isn't necessary: a value of type Bad can
only have one possible constructor.  The solution is to use a newtype:

  newtype Good = Good Int

Now, when a value of type Bad is stored at runtime, it will simply
store an Int, with no tag.  The benefit of declaring a newtype like
this is that the typechecker will ensure that you cannot mix up Goods
and Ints, although at runtime they will have the same representation.

So, to answer your question, the only computational overhead with a
data declaration is the extra memory and time to store and process the
constructor tags.  It usually isn't noticeable, but sometimes the
difference can be important.

-Brent


More information about the Haskell-Cafe mailing list