Pointers in Haskell??

Jeff Dalton jeff@aiai.ed.ac.uk
Fri, 7 Dec 2001 18:29:49 GMT


In-Reply-To: Hamilton Richards's message of Fri, 7 Dec 2001 12:11:23 -0600

> In my previous example,
> 
> >  t = [0..]
> >  b = 3 : t
> >  c = 5 : t
> 
> lists b and c share t, but in
> 
> >  x = 3 : [0..]
> >  y = 5 : [0..]
> 
> lists x and y share nothing. Extensionally, they have the same values as b
> and c, but each has its own copy of [0..].

That's because you're interpreting "same value" extensionally.
The same sort of issue comes up in Lisp or Java.  But suppose
in Java I have

   Object x = new Whatever();

and that new object has some large substructures.  I can get
one of those substructures to be shared, rather than copied,
without having a variable whose value is that substructure.
For instance, the substructure might be shared in

   Object[] anArray
      = new Object[](x.getSubstructure(),
                     x.getSubstructure());

provided that x.getSubstructure() returns the very same substructure
(not a copy) each time.

>    Unless, that is, the compiler is clever enough to recognize the
> subexpression [0..] which x and y have in common. I don't know whether any
> Haskell compilers look for common subexpressions, but it's certainly an
> option.
>    So the question of whether names are "*the* (only) way" to obtain
> sharing isn't really a language question-- it's more of a compiler question.

Are they the only way that's guaranteed to result in sharing, or is
even that not the case?

Cheers,
Jeff