Scala пытается определять типы по одному блоку параметров за раз.Вы можете увидеть это, если добавите еще один параметр и примените его частично:
def x[T](a: T, b: T)(c: T) = (a == b)
scala> x(1, "one") _
res0: Any => Boolean = <function1>
Конечно, и Int
, и String
равны Any
(а ==
определено для Any
).
Параметры типа, которые не используются в более раннем блоке, остаются свободными для использования в более позднем блоке:
def y[T,U](a: T)(b: U)(c: (T,U)) = (a == b)
scala> y(1)("one")
res1: (Int, java.lang.String) => Boolean = <function1>
Вы также можете использовать более ранние блоки как значения по умолчанию в более поздних блоках!
def z[T,U](a: T)(b: U)(c: (T,U) = (a,b)) = (c._1 == c._2)
scala> z(1)("one")()
res2: Boolean = false
Таким образом, распределение ваших параметров по нескольким блокам параметров имеет последствия как для вывода типа, так и для дефолта (и для частичного применения).