LINUX.ORG.RU

История изменений

Исправление 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+()})`.