On Feb 7, 2006, at 9:49 AM, Malcolm Wallace wrote:

Robert Dockins <[EMAIL PROTECTED]> writes:

i would argue against treating tuples as pure syntactic sugar for
nested pairs; since the nesting carries hierarchical information, i
would expect (x,y,z) used in place of (x,(y,z)) to cause an error.

Indeed, quite apart from anything else, transforming tuples into
nested tuples changes the performance of access from constant-time
into linear-time (using the right-nested transformation specified
by Robert), or at best, log-time (using a balanced tree schema).
This is highly undesirable.

I'm not convinced. Because the tuples are right-strict you can aggressively apply unboxing to the spine and recover constant time access to tuples whose shape is known at compile time (which includes all Haskell tuple code currently written). At the very least you can special case the shapes of tuples up to, say n=15, and hit all the cases that people really care about -- and still have a generic fallback for n > 15. The transformation can be a merely *semantic* one. You, the clever compiler writer, can do whatever you need to do to make it go fast so long as it respects the semantics, and spine- strictness gives you a fair amount to work with.

The copout (in my opinion) is the current system where tuples are
defined up to some set n (64 in GHC I think -- the report only
mandates 15), and if you want bigger tuples you're SOL.

To address this problem, I think we should permit user-definition of
tuple constructors with the expected syntax e.g.  (,,,,,), which is
already accepted by at least some compilers (nhc98,yhc).

Right.  This solve the first part of the problem.

More disturbing is the complete inability to write general functions
over tuples.
              The only fully general solution is to use something
like template haskell which 1) is overkill 2) has ugly syntax (sorry
but it's true) 3) GHC only and 4) hard to learn.

I don't believe you need to invoke the full awesome majesty of
Template Haskell in this case.  Surely plain -fgenerics will suffice?
I am hoping that some simple form of data-type generics will make it
into the new standard.

As I understand it, you still have to write down the instance declarations when using '-fgenerics'. So you are still limited by the amount of time you are willing to spend typing ;-) For GHC at least you can exhaust the available tuple constructors, but what if we take your suggestion above and recognize arbitrary numbers of ',' in parens? You can sprinkle in the appropriate instance declarations whenever you need them, but now you can get conflicts with multiple modules creating the same instance (and there's no way to block instance imports). It's clearly an improvement (except that nobody seems to use it), but its not the solution in its full generality.

The root problem seems to be that there is no type level way to perform induction/recursion on the size of a tuple. Maybe nobody cares but me, but I'd like to see generic curry and zip functions, etc. It seems like data marshaling libraries could also benefit from "inductive" tuples.

Anyway, if nobody else speaks out in favor of this I'm going to drop it for now -- maybe this is something to look at for Haskell 2.


Rob Dockins

Speak softly and drive a Sherman tank.
Laugh hard; it's a long way to the bank.
          -- TMBG



_______________________________________________
Haskell-prime mailing list
Haskell-prime@haskell.org
http://haskell.org/mailman/listinfo/haskell-prime

Reply via email to