Подтвердить что ты не робот

Нужна помощь в понимании каррирования с помощью закрытий groovy?

Я пытаюсь понять, как работает currying в функциональном программировании. Я прошел через wiki и пару вопросов о том же в SO.

Нужна помощь в понимании лямбда (карри)

Что такое "Currying" ?

Я понимаю, что каррирование - это разделение функции, которая принимает n аргументов в n или меньше функций с одним аргументом каждый. Я теоретически понимаю это, но я не могу подключить точки при кодировании для них. Возможно, это моя нехватка знаний на языках функционального программирования или С# (как много ответов в вышеприведенных вопросах).

В любом случае, я понимаю groovy и java. Поэтому я попытался получить схему стандартной add(a,b) функции в groovy, но я не смог ее закончить.

def closure = { arg ->
   // ??
}

def add(anotherClosure , a){
    return closure // ??
}

Может кто-нибудь помочь мне понять каррирование с помощью закрытий groovy?

4b9b3361

Ответ 1

Вы можете перевернуть свою собственную функцию currying, написав закрытие, которое требует другого закрытия и заданного параметра curries, и возвращает закрытие, которое использует это значение.

// Our closure that takes 2 parameters and returns a String
def greet = { greeting, person -> "$greeting $person" }

// This takes a closure and a default parameter
// And returns another closure that only requires the
// missing parameter
def currier = { fn, param ->
  { person -> fn( param, person ) }
}

// We can then call our currying closure
def hi = currier( greet, 'Hi' )

// And test it out
hi( 'Vamsi' )

Но вы лучше придерживаетесь встроенного метода Groovy curry как показано jalopaba. (есть также rcurry и ncurry которые выглядят справа и в заданном положении соответственно)

Следует сказать, что метод Groovy curry является неправильным, так как это скорее случай частичного приложения, как вы это делаете не нужно спускаться к замыканию, требующему только одного параметра, то есть:

def addAndTimes = { a, b, c -> ( a + b ) * c }

println addAndTimes( 1, 2, 3 ) // 9

def partial = addAndTimes.curry( 1 )

println partial( 2, 3 ) // 9

Ответ 2

Вы можете установить фиксированное значение для одного или нескольких аргументов для экземпляра замыкания, используя метод curry():

def add = { a, b -> a + b }
def addFive = add.curry(5)
addFive(3) // 5 + 3 = 8

Другой пример:

def greeter = { greeting, name -> println "${greeting}, ${name}!" }
def sayHello = greeter.curry("Hello")
sayHello("Vamsi") // Hello, Vamsi!
def sayHi = greeter.curry("Hi")
sayHi("Vamsi") // Hi, Vamsi!