Это просто способ избежать наследования? - PullRequest
9 голосов
/ 28 апреля 2010

Итак, мое понимание каррирования (на основе вопросов SO) заключается в том, что он позволяет частично установить параметры функции и в результате вернуть «усеченную» функцию.

Если у вас большая волосатая функция, принимает 10 параметров и выглядит как

function (location, type, gender, jumpShot%, SSN, vegetarian, salary) {
    //weird stuff
}

и вам нужна функция "подмножество", которая позволит вам иметь дело с пресетами для всех, кроме jumpShot%, разве вы не должны просто выделить класс, который наследует от исходной функции?

Полагаю, то, что я ищу, - это сценарий использования этого шаблона. Спасибо!

Ответы [ 4 ]

5 голосов
/ 28 апреля 2010

Карринг имеет много применений. От простого задания параметров по умолчанию для функций, которые вы часто используете, до возврата специализированных функций, которые служат определенной цели.

Но позвольте мне привести вам этот пример:

function log_message(log_level, message){}
log_error = curry(log_message, ERROR)
log_warning = curry(log_message, WARNING)

log_message(WARNING, 'This would be a warning')
log_warning('This would also be a warning')
1 голос
/ 28 апреля 2010

При программировании в функциональном стиле вы часто привязываете аргументы для генерации новых функций (в данном примере, предикатов) из старых. Псевдо-код:

filter(bind_second(greater_than, 5), some_list)

может быть эквивалентно:

filter({x : x > 5}, some_list)

где {x : x > 5} - определение анонимной функции. Таким образом, он создает список всех значений из some_list, которые больше 5.

1 голос
/ 28 апреля 2010

В JavaScript я делаю карри на функции обратного вызова (потому что они не могут быть переданы никакие параметры после того, как они вызваны (из вызывающей стороны)

Так что-то вроде:

...
var test = "something specifically set in this function";
onSuccess: this.returnCallback.curry(test).bind(this),

// This will fail (because this would pass the var and possibly change it should the function be run elsewhere
onSuccess: this.returnCallback.bind(this,test),
...

// this has 2 params, but in the ajax callback, only the 'ajaxResponse' is passed, so I have to use curry
returnCallback: function(thePassedVar, ajaxResponse){
   // now in here i can have 'thePassedVar', if 
}

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

0 голосов
/ 23 декабря 2010

Во многих случаях пропускаемые параметры будут известны не во время компиляции, а во время выполнения. Кроме того, нет ограничения на количество каррированных делегатов, которые могут существовать для данной функции. Следующее адаптировано из реальной программы.

У меня есть система, в которой я отправляю пакеты команд на удаленную машину и получаю ответные пакеты. Каждый пакет команд имеет порядковый номер, и каждый ответ содержит порядковый номер команды, на которую он является ответом. Типичная команда, переведенная на английский, может быть «дать мне 128 байтов, начиная с адреса 0x12300». Типичный ответ может быть «Успешным». вместе с 128 байтами данных.

Для обработки связи у меня есть подпрограмма, которая принимает несколько командных пакетов, каждый с делегатом. После получения каждого ответа соответствующий делегат будет запущен для полученных данных. Делегат, связанный с приведенной выше командой, будет выглядеть примерно так: «Подтвердите, что я получил« успех »со 128 байтами данных, и, если это так, сохраните их в моем буфере по адресу 0x12300». Обратите внимание, что несколько пакетов могут быть ожидающими в любой момент времени; параметр адреса curry необходим для того, чтобы подпрограмма знала, куда должны поступать входящие данные. Даже если бы я захотел написать подпрограмму «хранить данные в буфере», в которой не требовался параметр адреса, у него не было бы способа узнать, куда должны идти входящие данные.

...