Comments 5
Идея частичного применения меня весьма неслабо возбуждает.
А почему не показаны «Композиция и частичное применение» для Scala?
Сначала идёт пример «частичного применения». Он несколько отличается от currying: можно применять к любым ф-циям(например библиотечным, которые нельзя переопределить для currying), а также можно применять к любому набору параметров. Затем идет композиция.
По поводу «частичного применения» и «ф-ции которые нельзя переопределить для currying», у ф-ций есть метод curried.
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, и вполне правильно решил обойти в ней этот непростой топик.Если посмотреть на проблему чуть шире, то в языках с императивной родословной бардак с использованием функциональной терминологии и я много раз пожалел, что взялся именно за эту статью :)
Да, согласен, конструкция
Тут и происходит путаница. С другой стороны, всё вполне логично. В функциональном мире мы оперируем ф-циями, а
И соглашусь, что видимо автор не силён в 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.
Functional thinking: Thinking functionally, Part 3