Pull to refresh

Comments 5

Идея частичного применения меня весьма неслабо возбуждает.
А почему не показаны «Композиция и частичное применение» для Scala?
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 ]

Сначала идёт пример «частичного применения». Он несколько отличается от currying: можно применять к любым ф-циям(например библиотечным, которые нельзя переопределить для currying), а также можно применять к любому набору параметров. Затем идет композиция.
По поводу «частичного применения» и «ф-ции которые нельзя переопределить для currying», у ф-ций есть метод curried.
val curriedAdder = (adder _).curried // curriedAdder: (Int) => (Int) => Int = <function1>
curriedAdder(3)(2) // res3: Int = 5

val anotherIncrementor = curriedAdder(1)
anotherIncrementor(5) // res4: Int = 6

В скале немного другая (неустоявшаяся?) терминология. Частичное примение (partially applied method) в ней это преобразование метода в функцию (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» синтаксиса. Немного путает, но если копнуть глубже, то всё становится на свои места.

И соглашусь, что видимо автор не силён в Scala, поэтому скудные примеры.
Sign up to leave a comment.

Articles