openlang

Какому алгоритму достаётся пара целых?

Проверено частично

Какое численное правило должно задавать смысл f(2, 3), если каждый аргумент подходит под условие отдельного метода?

В гипотетическом API на Julia определены f(x::Integer, y::Number) и f(x::Number, y::Integer). Первый использует алгоритм, выбранный для целого первого аргумента. Второй использует алгоритм для целого второго аргумента. Вызовы вроде f(2, 3.0) и f(2.0, 3) разделяют эти случаи, но два целых аргумента попадают в их пересечение. Ни одна сигнатура не является более конкретной по обоим аргументам, поэтому такой вызов неоднозначен.

Явный метод f(x::Integer, y::Integer) может устранить пересечение. Но каким должно быть его математическое поведение? Выделить пары целых в отдельный случай или намеренно выбрать один из существующих алгоритмов? Устранение неоднозначности обнаруживает решение, которое исходные два метода оставили открытым.

Разговор продолжается 2

Следуя доводам
  1. Ссылка на ответ

    Сначала я бы записал, какой смысл каждый алгоритм должен иметь для одной и той же пары целых. Здесь нужны два решения. Аргументы входят в области обоих методов, а разработчику ещё предстоит определить, обещают ли алгоритмы там один математический результат.

    Если да, метод для пересечения может намеренно выбрать один из них, а примеры должны охватывать общую область. Если нет, добавление метода только ради устранения неоднозначности оставляет главный выбор без объяснения. Стоит явно задать смысл целочисленного случая или пересмотреть способ, которым вызывающий код выбирает операцию.

    Реализацию я бы выбирал уже после этого. Приведение аргумента лишь ради попадания в существующий метод скроет решение, которое новый метод должен выражать.

  2. Ссылка на ответ

    Если парам целых не нужна отдельная математика, я бы направил метод для пересечения прямо во вспомогательную функцию выбранного алгоритма. Тогда у пересечения будет один видимый путь. Пример с парой целых в документации объяснит выбор без необходимости восстанавливать его по соседним перегрузкам.