
Hi, A weird question, what does the 1 element tuple look like? () -- 0 element tuple (,) a b -- 2 element tuple (,,) a b c -- 3 element tuple () a - meaningless (a) - a in brackets GHC has the 1 element unboxed tuple, (# a #), and all the other sizes unboxed as well, but how would you visually represent the 1 element boxed tuple? As it happens, Yhc _does_ have the 1 element tuple, you just can't use it from normal programs, its only created by desugarings of class instances. I'd quite like to change this, and I also need to render the 1 element tuple in some way, so wondered if anyone had any good ideas (or if there is even some sort of convention) I currently use ()1, but don't like that as it doesn't follow Haskell rules - the () and 1 would be separate lexemes. My other thought is (?), where ? is something appropriate - but all the appropriate things I can think of would either not be a lexeme (i.e. 1), having an existing meaning (i.e. . | etc) or seem wrong. Thoughts? Neil

On Tue, Dec 19, 2006 at 10:41:56PM +0000, Neil Mitchell wrote:
A weird question, what does the 1 element tuple look like?
() -- 0 element tuple (,) a b -- 2 element tuple (,,) a b c -- 3 element tuple
() a - meaningless (a) - a in brackets ... Thoughts?
Python uses the syntax (foo,) to denote a singleton tuple (that is an extra comma at the end); quoting the python tutorial "Ugly, but effective".

On Tue, Dec 19, 2006 at 10:41:56PM +0000, Neil Mitchell wrote:
Hi,
A weird question, what does the 1 element tuple look like?
() -- 0 element tuple (,) a b -- 2 element tuple (,,) a b c -- 3 element tuple
() a - meaningless (a) - a in brackets
GHC has the 1 element unboxed tuple, (# a #), and all the other sizes unboxed as well, but how would you visually represent the 1 element boxed tuple?
As it happens, Yhc _does_ have the 1 element tuple, you just can't use it from normal programs, its only created by desugarings of class instances. I'd quite like to change this, and I also need to render the 1 element tuple in some way, so wondered if anyone had any good ideas (or if there is even some sort of convention)
I currently use ()1, but don't like that as it doesn't follow Haskell rules - the () and 1 would be separate lexemes. My other thought is (?), where ? is something appropriate - but all the appropriate things I can think of would either not be a lexeme (i.e. 1), having an existing meaning (i.e. . | etc) or seem wrong.
Thoughts?
Python seems to use (1,) which seems reasonably clear. -- Dennis Griffith, ACM@UIUC Treasurer

Neil Mitchell wrote:
Hi,
A weird question, what does the 1 element tuple look like?
() -- 0 element tuple (,) a b -- 2 element tuple (,,) a b c -- 3 element tuple
() a - meaningless (a) - a in brackets
GHC has the 1 element unboxed tuple, (# a #), and all the other sizes unboxed as well, but how would you visually represent the 1 element boxed tuple?
Tuples represent dimensionality therefore a 1-element tuple is just a 1-dimensional value ie the value itself hence a == (a) == ((a)) == (((a))) == ... Brian. -- http://www.metamilk.com

On Tue, Dec 19, 2006 at 11:35:49PM -0000, Brian Hulley wrote:
Tuples represent dimensionality therefore a 1-element tuple is just a 1-dimensional value ie the value itself hence a == (a) == ((a)) == (((a)))
That is true in a strict language, and for unboxed (unlifted) types, but in haskell tuples are lifted types -- (a) contains _|_ and (_|_), while a only contains _|_.

Hi
Python uses the syntax (foo,) to denote a singleton tuple (that is an extra comma at the end); quoting the python tutorial "Ugly, but effective".
Yes, I thought of that, the issue is: (a,b) is considered syntactic sugar for (,) a b (a,) is syntactic sugar for... And the place I'm displaying this is definately after desugaring!
Could tuples be implemented as an HList? singleton = (`hCons` hNil)
Not in Yhc, no higher rank types :) Also tuples are really really common, every class function has quite a few floating around - HList is just too much overhead (I think).
Tuples represent dimensionality therefore a 1-element tuple is just a 1-dimensional value ie the value itself hence a == (a) == ((a)) == (((a)))
Tuples are a box you can put things in, in Haskell: data Tuple a = Tuple a Tuple (Tuple 1) /= 1 (either at runtime, at type time, or any other time) Thanks Neil

A weird question, what does the 1 element tuple look like?
there is one in Control.Monad.Identity: Identity 1 i miss the short version newtype Id x = x writing (1,) is not that well defined; how do you want to use its constructor alone? writing (1;) may be the solution, i think. (;) could be the constructor. does anyone know, how ";" could cause any problems? if i am not mistaken, (do return 1 ; return 2;) should be the same like ((do return 1 ; return 2);). - marc

On Tue, 19 Dec 2006, Neil Mitchell wrote:
() -- 0 element tuple (,) a b -- 2 element tuple (,,) a b c -- 3 element tuple
The problem is that the separator approach (comma) doesn't scale well: http://haskell.org/haskellwiki/Terminator_vs._separator

have it be ( ) 1 with a space between the parens to denote that it is a single tuple rather than a nullary one. John -- John Meacham - ⑆repetae.net⑆john⑈

More generally, is there an operator version of dotted pair notation (gasp, did I just lisp?) that works like: data Tuple a b = () | Tuple a b () == () ( ) 1 == Tuple 1 () (2,'a',"hello") == Tuple 2 (Tuple 'a' (Tuple "hello" ())) And is there anyway in Haskell to restrict the type definition above to require that b be a type that can be constructed (possibly recursively) with only () or Tuple, so the user doesn't do something stupid like Tuple 1 'a', which is not a valid dotted pair? Dan John Meacham wrote:
have it be ( ) 1
with a space between the parens to denote that it is a single tuple rather than a nullary one.
John

On Fri, Dec 22, 2006 at 11:13:50AM -0800, Dan Weston wrote:
More generally, is there an operator version of dotted pair notation (gasp, did I just lisp?) that works like:
data Tuple a b = () | Tuple a b
() == () ( ) 1 == Tuple 1 () (2,'a',"hello") == Tuple 2 (Tuple 'a' (Tuple "hello" ()))
And is there anyway in Haskell to restrict the type definition above to require that b be a type that can be constructed (possibly recursively) with only () or Tuple, so the user doesn't do something stupid like Tuple 1 'a', which is not a valid dotted pair?
HList seems similar to what you are going for: http://homepages.cwi.nl/~ralf/HList/ John -- John Meacham - ⑆repetae.net⑆john⑈
participants (9)
-
Brian Hulley
-
Dan Weston
-
dgriffi3@uiuc.edu
-
Greg Fitzgerald
-
Henning Thielemann
-
John Meacham
-
Marc A. Ziegert
-
Neil Mitchell
-
Stefan O'Rear