Так функция вы ищете принимает аргумент определенного типа и должна возвращать функцию, которая принимает аргумент того же типа и возвращает функцию с принимает аргумент того же типа и так далее , до бесконечности.
Проблема здесь состоит в том, что тип этой функции является то, на линиях:
T[X] = X => T[X]
То есть, это рекурсивный, автореферентно типа. Поскольку он является саморегуляцией, мы должны назвать его с единственной целью повторного использования его внутри себя (к сожалению, Scala не имеет комбинатора с фиксированной запятой для бесконечных типов). Давайте назовем это InfCurry
и это выглядит примерно так:
trait InfCurry[T] extends (T => InfCurry[T])
Как вы можете видеть, это подражает приведенное выше определение достаточно хорошо (другой вариант был бы псевдонимами типа, но Scala не поддерживает рекурсивный тип-псевдонимов) ,
Давайте также определить метод конструктора, чтобы помочь использование определить наши бесконечно кэрри функции:
object InfCurry {
def apply[T](f: T => InfCurry[T]): InfCurry[T] = new InfCurry[T] {
def apply(x: T) = f(x)
}
}
С помощью этой небольшой утилиты вы можете определить такие вещи, как это:
val f: InfCurry[Int] = InfCurry { x =>
println(x)
f
}
И вы это мало использовать вещь вот так:
val g = f(1)(2)(3)(4)(5)(6)(7)
g(8)(9)(10)(11)(12)
Возможно, в этом случае вы хотели бы использовать меня thod с переменным числом аргументов - см. другой ответ - но это то, что вы спросили.
Любая причина, по которой вы не можете использовать список параметров, а не только неизвестное количество параметров? – us2012
Я не вижу, как этот код мог компилироваться. 'val' является зарезервированным словом в Scala (если вы не закрываете его в обратном тике). Что касается этой диагностики, она должна быть понятной. Непосредственно рекурсивные методы не могут полагаться на вывод типа для получения типа результата метода; вы должны дать это явно. –