Scala, каррирование и перегрузка

Скажите, что у вас есть следующее:

foo(x: String)(y: Int): Int
foo(x: String)(y: Double): Int

Scala не допускает такого выражения. Насколько я вижу, причиной этого является то, что foo ( "asdf" ) не имеет четко определенного типа (это либо Int = > Int, либо Double = > Int).

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

Ответы

Ответ 1

Перегрузка разрешения в Scala учитывает только первый список параметров. Поэтому альтернативы в этом списке должны отличаться. Для этого есть веская причина. Затем мы можем использовать разрешенный тип функции для вывода типа последующих аргументов. Это позволяет использовать идиомы:

xs.corresponds(ys) { (x, y) => x < y }

Обратите внимание, что здесь нам нужно знать тип corresponds, чтобы вывести типы x и y. Было бы обидно, если бы это сломалось, когда corresponds перегружен.

Ответ 2

Это не первый раз, когда это было задано: было задано в 2009 году. К сожалению, Мартин прямо не указал, в чем состоят проблемы, кроме того, для этого потребуется довольно обширное изменение спецификации в отношении того, как работает перегрузка. Я просмотрел спецификацию, и мне не ясно, где лежат основные проблемы, но я недостаточно квалифицирован в спецификации, чтобы дать окончательный ответ в любом случае.

Ответ 3

Простой обходной путь - использовать анонимный объект:

def foo(x: String) = new {
  def apply(y: Int): Int
  def apply(y: Double): Int
}