Scala имеет функции и методы, они не совсем одно и то же.
def add(a: Int, b: Int, c: Int) = a + b + c
Который определил метод (не функцию !!).
val add2 = (a: Int, b: Int, c: Int) => a + b + c
Который присвоил add2 значение функции (а не метод !!).
Метод не может быть конечным значением, тогда как функция может:
scala> add
<console>:9: error: missing arguments for method add;
follow this method with `_' if you want to treat it as a partially applied function
add
^
scala> add2
res1: (Int, Int, Int) => Int = <function3>
scala> val a = add
<console>:8: error: missing arguments for method add;
follow this method with `_' if you want to treat it as a partially applied function
val a = add
^
scala> val a2 = add2
a2: (Int, Int, Int) => Int = <function3>
Запись подчеркивания после имени метода может явным образом преобразовать метод в функцию:
scala> add _
res2: (Int, Int, Int) => Int = <function3>
Но если вы пишете подчеркивание после значения, оно преобразуется в функцию, которая не принимает аргументов с типом возвращаемого значения его типа:
scala> val s = ""
s: String = ""
scala> val i = 1
i: Int = 1
scala> s _
res3: () => String = <function0>
scala> i _
res4: () => Int = <function0>
Таким образом, если само значение является функцией, то после записи подчеркивания будет получена новая функция, которая не принимает аргументов с возвращаемым типом функции:
scala> add2 _
res5: () => (Int, Int, Int) => Int = <function0>