Вывод типа достаточно умен, чтобы выяснить тип, когда тип оперирует с другим типом
Предположим, что этот тип логического кода для логического элемента в списке,
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
и компилятор не работает.