Скала, карри и перегрузка - PullRequest
15 голосов
/ 24 августа 2011

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

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

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

Есть ли причина, по которой такие «многотипные» функции не должны быть разрешены?

Ответы [ 3 ]

21 голосов
/ 25 августа 2011

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

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

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

2 голосов
/ 24 августа 2011

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

0 голосов
/ 28 июня 2019

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

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