[Haskell-cafe] One-element tuple

AntC anthony_clayden at clear.net.nz
Tue Aug 20 03:07:18 CEST 2013

> Daniel F <difrumin <at> gmail.com> writes:
> Can you please elaborate why this inconsistency is annoying and what's 
the use of OneTuple?
> Genuine question,

Hi Daniel, the main annoyance is the verbosity (of using a data type and 
constructor), and that it no longer looks like a tuple.

The inconsistency is because a one-element tuple is just as cromulent as a 
n-element, or a zero-element. (And that a one-element tuple is a distinct 
type from the element on its own/un-tupled.)

So if I have instances (as I do) like:

    instance C (a, b) ...
    instance C ()     ...

I can't usefully put either of these next two, because they're equiv to 
the third:

    instance C (( a )) ...
    instance C ( a )   ...
    instance C a       ...   -- overlaps every instance

Similarly for patterns and expressions, the so-called superfluous parens 
are just stripped away, so equivalent to the bare term.

The use of OneTuple is that it comes with all Prelude instances pre-
declared (just like all other tuple constructors). I don't see that it has 
an advantage over declaring your own data type(?) I'd also be interested 
to know who is using it, and why.

What I'm doing is building Type-Indexed Tuples [1] mentioned in HList [2], 
as an approach to extensible records [3], on the model of Trex [4] -- all 
of which acknowledge one-element records/rows/tuples. And then I'm using 
the tuples as a platform for relational algebra [5] with natural Join (and 
ideas from Tropashko's 'Relational Lattice' [6]). 

Is there anybody using OneTuple 'in anger'?


[1] M. Shields and E.Meijer. Type-indexed rows. In Proceedings
    of the 28th ACM SIGPLAN-SIGACT symposium on Principles
    of Programming Languages, pages 261–275. ACMPress, 2001.
[2] http://hackage.haskell.org/package/HList
[3] http://www.haskell.org/haskellwiki/Extensible_record
[4] http://web.cecs.pdx.edu/~mpj/pubs/polyrec.html
[5] http://en.wikipedia.org/wiki/Relational_algebra#Natural_join_
[6] http://vadimtropashko.wordpress.com/relational-lattice/

> On Fri, Aug 16, 2013 at 5:35 AM, AntC <anthony_clayden <at> 
clear.net.nz> wrote:
> There's an annoying inconsistency:
>     (CustId 47, CustName "Fred", Gender Male)  -- threeple
>     (CustId 47, CustName "Fred)                -- twople
> --  (CustId 47)                                -- oneple not!
>     ()                                         -- nople

More information about the Haskell-Cafe mailing list