Мой друг и я обсуждали карри и применение частичных функций в 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), это не означает, что вы не можете создать функцию более высокого порядка язык, который способен инкапсулировать понятие частично прикладной функции. Кроме того, несмотря на то, что функция «применена», область действия функции по-прежнему связана с возвращаемым ей замыканием, в результате чего она остается «частично примененной».
Что правильно?