2012-07-03 2 views
2

Я определяю функцию переменной-arity sum для языка игрушек. Мне кажется естественным разрешить его называть без аргументов и возвращать 0, но real языки (и их реализации) не соглашаются между собой.Правильное поведение для функции суммирования переменной arity

Есть ли прецедент, где возврат нуля будет менее правильным, чем выброс исключения?

ответ

5

Математически говоря, empty sum (сумма чисел) определяется как нуль. Чтобы быть математически корректным, возвращение нуля кажется правильным выбором здесь. Выброс исключения в этом случае потенциально затруднит использование вашей функции, так как вы должны быть уверены, что будете защищать каждый вызов с помощью try/catch, если вы каким-то образом предоставите нулевые аргументы.

Надеюсь, это поможет!

0

Есть одна ситуация, в которой вы можете не хотеть, чтобы она возвращала ноль: предположим, что ваш язык динамически типизирован и позволяет + работать с нечисловыми типами (например, он может конкатенировать строки, как в Python). Тогда пустая сумма является двусмысленной в отношении того, что это, по идее, суммирование: вы можете получить результат для чисел «,» для строк, [] для списков и т. Д.

Если ваш язык подобен этому, то вы можете выбрать (1) вернуть 0 в любом случае и принять, что sum(things)+other_thing не равно sum(things together with other_thing), за исключением чисел, (2) исключение, (3) вернуть какое-то особое значение, которое ведет себя как 0 при добавлении к номерам, например "" при добавлении к строкам и т. д., или (4) в любом случае возвратить (скажем) 0 и сказать, что 0+ "" равно "" или что-то в этом роде. Пожалуйста, не делайте # 4, если есть хоть малейшая опасность того, что язык будет чем-то другим, кроме игрушки.

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

+1

В этом случае правильным ответом было бы вернуть идентификатор элемент для любого оператора бинарной сложения. Дело не в том, что вы должны выбросить исключение столько, сколько должно сказать «вернуть личность». – templatetypedef

+0

Проблема заключается в том, что ваш двоичный оператор не может иметь * один элемент идентификации. Например, если он добавляет числа и объединяет строки, их не будет. (Вы можете утверждать, что что-то без элемента идентификации не следует называть «+», а его вариационную версию назвать «sum», и вы можете быть правы, но это отдельная проблема.) –

+2

Но это два разных оператора - один из них + задан над целыми числами, а один из них равен + по строкам. Оператор перегружен, но каждый отдельный оператор имеет определенный единичный элемент. – templatetypedef

Смежные вопросы