История изменений
Исправление
Legioner,
(текущая версия)
:
Но что будет в случае, если функция foo полиморфна, и принимает несколько типов
Можно переформулировать: функция foo принимает параметр, который может принимать значения из нескольких типов. Т.е. мы вводим операцию над типами «или» и создаёт новый анонимный тип, например `String|Int`. Т.е. `def foo(s: String|Int)`. То, что в реальном синтаксисе обычно идёт несколько объявлений foo, сути не меняет, можно считать, что это такой сахар.
и если операцию + имеет не только число, но и строка? И еще несколько типов? Как же тогда можно вывести тип?
Для операции мы вводим опять же анонимный тип, который объединяет все типы, имеющие оператор «+». Аналогично можно определять типы, имеющие метод с определённым именем. Т.е. в результате компилятор выведет что-то вроде `def bar(x: Int|String, y: {has operator+()})`.
Правда, скорее всего, нам подойдёт не каждый оператор «+», а только тот, который принимает справа Int (у нас же foo возвращает Int). И компилятор этот факт, конечно, тоже должен вывести.
Исходная версия
Legioner,
:
Но что будет в случае, если функция foo полиморфна, и принимает несколько типов
Можно переформулировать: функция foo принимает параметр, который может принимать значения из нескольких типов. Т.е. мы вводим операцию над типами «или» и создаёт новый анонимный тип, например `String|Int`. Т.е. `def foo(s: String|Int)`. То, что в реальном синтаксисе обычно идёт несколько объявлений foo, сути не меняет, можно считать, что это такой сахар.
и если операцию + имеет не только число, но и строка? И еще несколько типов? Как же тогда можно вывести тип?
Для операции мы вводим опять же анонимный тип, который объединяет все типы, имеющие оператор «+». Аналогично можно определять типы, имеющие метод с определённым именем. Т.е. в результате компилятор выведет что-то вроде `def bar(x: Int|String, y: {has operator+()})`.