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
}