Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
def adder(x: Int, y: Int) = x + y
val incrementor = adder(_: Int, 1)
incrementor(5) // res1:Int = 6
def wrapper(s: String) = "[ " + s + " ]"
val niceIncrementor = incrementor andThen (_.toString) andThen wrapper
niceIncrementor(5) // res2: java.lang.String = [ 6 ]
val curriedAdder = (adder _).curried // curriedAdder: (Int) => (Int) => Int = <function1>
curriedAdder(3)(2) // res3: Int = 5
val anotherIncrementor = curriedAdder(1)
anotherIncrementor(5) // res4: Int = 6
adder _ будет примером частичного применения, с результатом (Int, Int) => Int). В Вашем примере просто строится замыкание. Кроме того, судя по путанице с неявными параметрами, автор не очень силён в Scala, и вполне правильно решил обойти в ней этот непростой топик.adder _ превращает метод в «partially applied function». Я так понимаю проблема в том, что в Scala отдельно существуют методы и функции (возможно наследие Java). И в моём случае adder _ создаёт объект типа Function2, который вызывает метод adder. То есть, если я объявлю adder как ф-цию, то пример будет выглядеть так:val adder = (x: Int, y: Int) => x + y
val curriedAdder = adder.curried
def создаёт метод. А так как метод — это не ф-ция, мы можем превратить его в функцию с помощью «partially applied function» синтаксиса. Немного путает, но если копнуть глубже, то всё становится на свои места.
Functional thinking: Thinking functionally, Part 3