Oops! I should have underlined in my last message where I wrote
`newtype' instead of `datatype'. As a result, Simon seems to have
completely misunderstood my proposal. Sorry about that.
Simon seems to think I am proposing that if one writes
datatype T a_1 ... a_k = C t_1 ... t_n
that one gets unlifted tuples. I am *not* proposing this. What I
propose is that if one writes
newtype T a_1 ... a_k = C t_1 ... t_n
then one gets unlifted tuples. I'm not stuck on the keyword
`newtype', anything other than `datatype' will do.
Simon writes of my true proposal (which he mistakenly labels an
alternative) `I like it not'. But doesn't say why. In particular, he
seems not to have hoisted on board that my proposal is just a
*generalisation* of his proposal to write
newtype T a_1 ... a_k = C t.
to declare a type isomorphic to an existing type.
In particular, if one wants to create a type `New a' isomorphic to an
existing type, Simon would write (by his latest proposal)
datatype Data a => New a = MakeNew a
whereas I would write
newtype New a = MakeNew a
So my alternative is simpler in some ways.
Simon also notes that strictness declarations don't seem sensible
for unlifted constructors. Indeed. Ban them. (Again, this is an
argument against something I never proposed.)
I think Simon's other points about ~ patterns are spurious. But I
don't want to rebut them, because now that I've pointed out that he
misunderstood my proposal, perhaps he no longer holds to them. Simon
(or anyone else), if you have further arguments against what I *did*
propose, please raise them again and I'll answer.
All in the spirit of a quest for the perfect Haskell! -- P