For the "consistency" you want, `data Oneple a = T a` is the best you can do in Haskell.

T(CustId 47) is just one character off from what you actually want to write: (Cust 47). And I presume you want the "extra bottom" that comes with this, as opposed to just treating values as their own one-tuples.

I imagine you could write some fancy hack that uses the type system to automatically promote values to Oneples of the given value when an "expected: Oneple Foo, actual: Foo" error occurs. But this would not be very useful in general.

An uglier option:

type Oneple a = (a, ())


-- Dan Burton


On Thu, Aug 15, 2013 at 7:05 PM, Ivan Lazar Miljenovic <ivan.miljenovic@gmail.com> wrote:
On 16 August 2013 11:35, AntC <anthony_clayden@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
>
> (That is, it's annoying if you're trying to make typeclass instances for
> extensible/contractable tuples. Yes, I know I could use HLists.)
>
> I'm not happy with either approach I've tried:
>
>     data Oneple a = Oneple a                   -- (or newtype)
>     (Oneple $ CustId 47)                       -- too verbose
>
>     type Oneple a = [a]
>     [CustId 47]                  -- at least looks bracket-y
>
> What do you do?

http://hackage.haskell.org/package/OneTuple :p

If you really wanted some form of parentheses you could possibly use
quasiquoting for it...

>
> AntC
>
>
>
> _______________________________________________
> Haskell-Cafe mailing list
> Haskell-Cafe@haskell.org
> http://www.haskell.org/mailman/listinfo/haskell-cafe



--
Ivan Lazar Miljenovic
Ivan.Miljenovic@gmail.com
http://IvanMiljenovic.wordpress.com

_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe