Re[8]: Тип 'void'
От: D. Mon Великобритания http://thedeemon.livejournal.com
Дата: 11.09.14 04:51
Оценка:
Здравствуйте, 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 эквивалентными? Остается два варианта — либо считать эти выражения различными, либо рассматривать кортеж из одного элемента специальным образом. Считать их различными кажется дико неудобно, а иметь специальные правила для единичного кортежа — костыль, который тоже вызовет кучу проблем и граблей.


Решение простое: не иметь кортежей единичного (и нулевого) размеров. Не так уж сложно, и никаких граблей.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.