В первом случае someMethod(m, _.someField == "aaa")
каждый аргумент в функции равен по важности, но если логический вывод сработает, а вы написали someMethod(m, _.someField == "aaa")
, то компилятор обрабатывает его как (x$1) => x$1.someField.$eq$eq("aaa")
. x$1
может быть A или любой подтип A. В этом случае, если вы измените порядок аргументов, логический вывод может измениться или не работать вообще, и это сделает сложный логический вывод для компилятора, который должен сканировать определение несколько раз.
Во втором случае, someMethod[Key, Value](m, _.id == "aaa")
, компилятор уже знает, что A является типом Key, а B является типом Value, и, следовательно, он компилирует
Что касается третьего случая someMethod(m)(_.someField == "aaa")
, компилятор должен выводить тип, когда вы уже написали someMethod (m), потому что это частичное приложение. Так что теперь, когда тип выведен, он может продолжить и применить к нему (f).
Дайте мне знать, если это поможет !!