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.

bluespec classic implemented n-tuples this way, and the error messages were rather ugly. not to mention that explaining this to beginners feels like a "oh yeah, it's not clean, it was an easy hack" copout :)

-- m

On Feb 4, 2006, at 11:03 PM, Robert Dockins wrote:

On Feb 4, 2006, at 7:56 PM, Pablo Barenbaum wrote:

An awkwardness in Haskell I would like to see solved in
Haskell', is the fact that the behavior of tuple-like
constructors must be either built-in or "limited".

One thing I recall seeing on haskell-cafe some time back was the notion that an n-tuple is semantically equivalent to n nested right- strict 2-tuples (essentially right-strict heterogeneous lists). Perhaps we should consider the idea of the tuple notation simply being syntactic sugar for nested right-strict 2-tuples. Consider:

data Tuple a b = Tuple a !b

-- (a,b) === Tuple a (Tuple b ())-- (a,b,c) === Tuple a (Tuple b (Tuple c ()))
-- etc...

fst (Tuple x _) = x
snd (Tuple x (Tuple y _)) = y

fst ('a',b') = 'a'
snd (a','b) = 'b'

fst ('a','b','c') = 'a'
snd ('a','b','c') = 'b'

fst ('a','b','c','d','e','f') = 'a'
-- etc...

It seems like compiler cleverness could recover the identical strictness and unboxing information available now when the "shape" of the tuple is known at compile time.



As far as I can see, these are two issues:

1. There is not a way, for the programmer, to define
infinite constructors for infinite associated types (such as
(,) (,,) (,,,) ... / (a, b) (a, b, c) (a, b, c, d) ...)
these must be built-in.

2. There is not a way to define functions operating on all
of these types. Instead, different functions (like zip,
zip3) must be defined. Something similar happens with
liftM, liftM2, ... these are "limited".

It seems the language is lacking abstraction, or being
misused, when the standard prelude issues this code:

  zip              :: [a] -> [b] -> [(a,b)]
  zip               = zipWith  (\a b -> (a,b))

  zip3             :: [a] -> [b] -> [c] -> [(a,b,c)]
  zip3              = zipWith3 (\a b c -> (a,b,c))

Clearly, at least for a human being, it's redundant.
I don't know if there already are proposals to solve this.

Sorry if I sound aggresive, I'm just trying to help.
Excuse my English...

Best regards.

--
Pablo Barenbaum
_______________________________________________
Haskell-prime mailing list
[email protected]
http://haskell.org/mailman/listinfo/haskell-prime


Rob Dockins

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


_______________________________________________
Haskell-prime mailing list
[email protected]
http://haskell.org/mailman/listinfo/haskell-prime

_______________________________________________
Haskell-prime mailing list
[email protected]
http://haskell.org/mailman/listinfo/haskell-prime

Reply via email to