Друг мой и я обсуждали вопрос о применении карри и частичной функции в Javascript, и мы пришли к совершенно иным выводам относительно того, насколько они достижимы. Я придумал эту реализацию Function.prototype.curry
, которая послужила основой для нашего обсуждения:
Function.prototype.curry = function() {
if (!arguments.length) return this;
var args = Array.prototype.slice.apply(arguments);
var mmm_curry = this, args;
return function() {
var inner_args = Array.prototype.slice.apply(arguments);
return mmm_curry.apply(this, args.concat(inner_args));
}
}
Используется следующим образом:
var vindaloo = function(a, b) {
return (a + b);
}
var karahi = vindaloo.curry(1);
var masala = karahi(2);
var gulai = karahi(3);
print(masala);
print(other);
Выходной сигнал этого в Spidermonkey следующий:
$ js curry.js
3
4
Его мнение заключалось в том, что, поскольку примитив Javascript function
не поддерживает "приложение с частичной функцией", совершенно неверно ссылаться на функцию, связанную с переменной karahi
, как частично применяемую. Его аргумент заключался в том, что когда функция vindaloo
находится в курсе, сама функция полностью применяется и возвращается замыкание, а не "частично примененная функция".
Теперь я считаю, что, хотя сам Javascript не поддерживает поддержку частичного приложения в своих примитивах function
(в отличие от ML или Haskell), это не означает, что вы не можете создать функцию более высокого порядка язык, который способен инкапсулировать понятие частично прикладной функции. Кроме того, несмотря на то, что "применяется", область действия функции все еще привязана к возвращаемому им закрытию, заставляя его оставаться "частично примененным".
Что правильно?