Здравствуйте, Aleх, Вы писали:
A>Возникает следующий вопрос. A>Считать ли выражения ((a, b), c) и (a, b, c) эквивалентными?
Ни в коем случае. В некоторых языках, правда, эквивалентными считаются (a, (b, c)) и (a, b, c), что довольно удобно.
A>1. Если да, то получается правило такое, что мы можем вставить содержимое вложенных кортежей в текущий. Пусть a имеет тип void, то есть a = (). Тогда получается, что ((a, b), c) эквивалентно ((), b, c), а это эквивалентно (b, c) (в первом преобразовании первый элемент внешнего кортежа преобразовался в два элемента из вложенного кортежа, а во втором преобразовании первый элемент внешнего кортежа преобразовался в ноль элементов).
Это безобразие, которое вызовет массу проблем. Проблем не будет, если туплы считать размером от 2. (а) и () — не туплы. (а) это просто а. () — это значение своего типа () а.к.а unit.
A>2. Если считать эти выражения различными, возникает проблема с кортежем единичного размера. Будет ли ((a), c) эквивалентно (a, c)? Считаются ли ((a)), (a) и a эквивалентными? Остается два варианта — либо считать эти выражения различными, либо рассматривать кортеж из одного элемента специальным образом. Считать их различными кажется дико неудобно, а иметь специальные правила для единичного кортежа — костыль, который тоже вызовет кучу проблем и граблей.
Решение простое: не иметь кортежей единичного (и нулевого) размеров. Не так уж сложно, и никаких граблей.