Tuple-like constructors

Ben Rudiak-Gould Benjamin.Rudiak-Gould at cl.cam.ac.uk
Wed Feb 8 16:49:30 EST 2006

Robert Dockins wrote:
> data Tuple a b = Tuple a !b
> -- (a,b)    === Tuple a (Tuple b ())-- (a,b,c) === Tuple a (Tuple b 
> (Tuple c ()))
> -- etc...

A problem with this is that there's no way of supporting partially-applied 
tuple type constructors without some sort of type system extension. But 
maybe there's no reason to support this. Are there any situations where 
people use "(,) a" where they couldn't simply define a new product type?

I rather like the following solution for traversable tuples:

Introduce unboxed pairs (# a,b #) and unboxed unit (# #) into the language. 
Allow datatypes to be specialized at unboxed types. Define

     data Tuple a = Tuple a

and let

     (a,b)   = Tuple (# a,(# b,(# #)#)#)
     (a,b,c) = Tuple (# a,(# b,(# c,(# #)#)#)#)

Then allow class instances to be declared at unboxed types and type 
parameters to be instantiated at unboxed types by doing compile-time 
specialization (like C++ templates), and voila. No problem of ordinary tuple 
access becoming less efficient, though some care would be needed to prevent 
typeclass-based traversal from taking O(n^2) time.

Of course, the compile-time specialization part is a bit tricky.

-- Ben

More information about the Haskell-prime mailing list