Есть одна ситуация, в которой вы можете не хотеть, чтобы она возвращала ноль: предположим, что ваш язык динамически типизирован и позволяет +
работать с нечисловыми типами (например, он может конкатенировать строки, как в Python). Тогда пустая сумма является двусмысленной в отношении того, что это, по идее, суммирование: вы можете получить результат для чисел «,» для строк, [] для списков и т. Д.
Если ваш язык подобен этому, то вы можете выбрать (1) вернуть 0 в любом случае и принять, что sum(things)+other_thing
не равно sum(things together with other_thing)
, за исключением чисел, (2) исключение, (3) вернуть какое-то особое значение, которое ведет себя как 0 при добавлении к номерам, например "" при добавлении к строкам и т. д., или (4) в любом случае возвратить (скажем) 0 и сказать, что 0+ "" равно "" или что-то в этом роде. Пожалуйста, не делайте # 4, если есть хоть малейшая опасность того, что язык будет чем-то другим, кроме игрушки.
О, и есть другой связанный случай: предположим, что ваш язык статически типизирован, но имеет мощный механизм вывода типа. Затем он мог бы различать суммирование чисел и суммирование строк и возвращение разных вещей в двух случаях. (Но вам понадобится довольно сложная система типов, чтобы сделать все, что сработает, что, я думаю, вы бы не потрудились для игрушечного языка.)
В этом случае правильным ответом было бы вернуть идентификатор элемент для любого оператора бинарной сложения. Дело не в том, что вы должны выбросить исключение столько, сколько должно сказать «вернуть личность». – templatetypedef
Проблема заключается в том, что ваш двоичный оператор не может иметь * один элемент идентификации. Например, если он добавляет числа и объединяет строки, их не будет. (Вы можете утверждать, что что-то без элемента идентификации не следует называть «+», а его вариационную версию назвать «sum», и вы можете быть правы, но это отдельная проблема.) –
Но это два разных оператора - один из них + задан над целыми числами, а один из них равен + по строкам. Оператор перегружен, но каждый отдельный оператор имеет определенный единичный элемент. – templatetypedef