Вывод типа достаточно умен, чтобы выяснить тип, когда тип оперирует с другим типом

Предположим, что этот тип логического кода для логического элемента в списке,

def doStuff[A](x: List[A]) = x // ignore the result 

doStuff(List(3)) // I dont need to speicify the type Int here

Однако, если тип A работает с другим типом, вывод типа не работает, я должен указать тип.

def doStuff[A, B](x: List[A], f: (B, A) => B) = {

}

doStuff(List(3), (x: String, y) => x) //compilation failed, missing parameter type
doStuff[Int, String](List(3), (x, y) => x) //compilation fine.

Могу ли я знать, почему это так?

Спасибо заранее

1 ответ

Решение

Вывод типа работает только для отдельных списков аргументов. Если вы измените doStuff к следующему:

def doStuff[A, B](x: List[A])(f: (B, A) => B) = {

}

Вывод типа будет работать так, как вы ожидаете:

doStuff(List(3))((x: String, y) => x)

Тем не менее, обратите внимание, что вывод типа слева направо, так что если вы положите Nil в качестве первого аргумента, это будет вывод A = Nothingчто почти никогда не то, что вы хотите.

ОБНОВИТЬ

В вашем оригинальном примере вызов doStuff(List(3), (x: String, y) => x) не удается, так как тип y в лямбду нельзя сделать вывод. List(3) находится в том же списке параметров, поэтому A пока не известно. Таким образом, нет никакого намека на тип y и компилятор не работает.

Другие вопросы по тегам