f()()
и g()()
, как вы их определяете, являются методами. Методы не являются функциями , но методы могут быть преобразованы в функции через " eta extension ". Один из способов сделать это - использовать подчеркивание вместо переданного параметра.
andThen()
- это метод Function
trait , который принимает функцию в качестве аргумента и возвращает новую функцию. Выглядит так, как будто вы также можете использовать метод в качестве переданного аргумента, но он молча переводится в состояние Function
.
Так что composed1()
выглядит как метод, но на самом деле это Function
, потому что это то, что возвращает andThen()
, и вы не можете применить расширение eta подчеркивания к Function
. Работает только на методах.
В качестве эксперимента превратите f()()
в Function
, который делает то же самое ...
def f :Int => Int => Int = (x: Int) => (y: Int) => x + y
... сейчас composed1()
не скомпилируется.
Итак, теперь, когда мы знаем, что composed1()
- это Function
, как мы можем получить то, что мы хотим от composed2()
? Просто. Пропустить подчеркивание.
def composed2(a: Int, b: Int, c: Int) =
composed1(a, b) andThen lastOne(c)
composed2(2, 2, 4)(5) //res0: Int = 13