In Haskell, lifted type products mean that there’s a semantic difference between (a,b,c) and (a, (b, c)).
If all pattern matches of all products was always irrefutable, then there would be no difference, and (a, b, c) could be syntactic sugar for (a, (b, c)).
Why did Haskell choose to lift type products?
One reason is that implementing
seqfor an unlifted product requires parallel/interleaved computation, sinceseq (a, b) Truewould be supposed to beTrueif and only if at least one ofaandbis non-bottom. You might not find this reason terribly convincing, depending on how you feel aboutseq, but of course polymorphicseqis by definition a part of Haskell…