Почему языки программирования генерируют сигнатуры методов независимо от типа возвращаемого значения?

11

Я работал со многими языками, которые не генерируют сигнатуру метода на основе возвращаемого типа. Я также работал с одним (может быть, с некоторыми), которые делают. Те, которые не доставляли мне проблем в прошлом (как здесь ). Почему языки программирования генерируют сигнатуры методов независимо от типа возвращаемого значения?

Обновление: я имею в виду специально скомпилированные статически типизированные языки

Чарльз Ламберт
источник
Это очень необоснованное предположение, но я предполагаю, что это связано со сложностью реализации компилятора и / или поддержки инструмента.
Чарльз Ламберт
В Haskell вы можете использовать классы типов для создания функций, которые зависят от типа возвращаемого значения. Я <3 Хаскелл: D: D: D
Томас Эдинг

Ответы:

5

Это плохо сочеталось бы с типизацией и иерархиями типов. Если у вас есть две версии метода, одна из которых возвращает тип A, а другая - тип B, у вас возникают проблемы, когда:

  • A или B являются подтипами друг друга, и вы присваиваете возвращаемое значение тому, которое является супертипом.
  • A и B имеют общий супертип, и вы присваиваете этому значению супертипа.

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

jprete
источник
1
Я работал с языками, которые включают тип возвращаемого значения в подписи. Кастинг повсюду - не проблема, как вы указываете. В вашем конкретном примере вам не нужно обходить это с помощью приведения. Если A и B (подтипы C) имеют одинаковую операцию, то она должна быть объявлена ​​в C. Если тип возвращаемого значения отличается от A для B: В большинстве случаев он пытается вернуть подтип C. Вы просто добавьте другой метод в подтип, который возвращает подтип, и реализуйте версию из C, чтобы вызвать метод с определенным подтипом. Теперь вам не нужно разыгрывать повсюду.
Чарльз Ламберт
@Charles Lambert: Это не операция над классами A, B или C. Это две функции с одинаковыми именами и списком параметров, одна из которых возвращает что-то типа A, а другая - что-то типа B. Этот вопрос применим больше, чем просто системы ООП, поэтому я ответил на основе общих типов и функций. Кроме того, я не понимаю, для чего предназначен ваш опровержительный пример; мне нужно больше подробностей, чтобы ответить на него.
jprete
Комментарий слишком короткий для примера. pastebin.com/JR39PKs0 в основном языки, которые включают тип возвращаемого значения в сигнатуре, уже придумали способы облегчения описываемой вами проблемы. Будь то соглашение по кодированию или просто стандартная практика. Также следует заметить, что мало что из того, что вы пишете, будет оправдывать создание методов, которые отличаются только типом возврата. Итак, еще раз, вы не будете иметь дело с этим очень часто
Чарльз Ламберт
Будет ли какое-либо затруднение иметь правило, согласно которому для любой данной сигнатуры аргумента может быть объявлен только один «первичный» метод, но может быть объявлено произвольное количество вторичных методов, и компилятор должен выполнить перегрузку, сначала идентифицировав сигнатуру аргумента, для которой первичный метод существует, а затем проверяет вторичные методы в каком-то указанном порядке, чтобы увидеть, было ли какой-либо из этих методов однозначно лучшим соответствием (или было бы пригодным для использования, даже если основной не был)?
суперкат
3

Потому что вы можете вызывать метод, а не назначать его результат.

Chiron
источник
3
Не на каждом языке.
Йорг Миттаг
@Jorg Нравится на каком языке?
Хирон
1
F # это один язык. Обычно вы видите foo -> ignore, где ignore - это метод с типом возвращаемой единицы, который похож на void
Чарльз Ламберт
Ада - лучший пример. Этот язык фактически использует типы возвращаемых данных как часть подписи.
Чарльз Ламберт
-4

Практическое правило: строго типизированные языки обычно связывают сигнатуру метода с возвращаемым типом. Слабо типизированных языков нет.
Я не знаю C #, но я предполагаю, что проблема может быть в том, как C # обрабатывает дженерики. Это может быть создание совершенно другого метода для универсального, в этом случае это действительно два разных метода.

CMR
источник
1
Мне интересно, на какой из этих строго типизированных языков вы ссылаетесь? Я не знаю ни одного, и я знаю, что C ++ явно запрещает разрешение возвращаемого типа.
Greyfade
2
-1 Если вы собираетесь дать эмпирическое правило, которое якобы неверно с одним примером, который нарушает его, вы должны следовать этому правилу во всех других примерах, где соблюдается правило.
@greyfade, я хотел сказать, что в слабо типизированных языках назначение не проверяется во время компиляции. Согласитесь, это может быть не уместно здесь.
CMR
Ваша точка зрения скрыта из-за вашего неточного утверждения о том, что "языки со строгой типизацией обычно связываются ... с типом возврата".
Greyfade