咖喱和空参数

时间:2015-10-30 11:02:27

标签: javascript lodash

我目前正在尝试自己讨论并且对空参数有疑问 我有一个curried函数来执行ajax请求:

>>> import itertools

>>> my_str = "Delete File/Folder"
>>> my_str = ' '.join(my_str.split()).replace('/ ', '/').replace(' /', '/')  # First clean string to ensure there aren't spaces around `/`
>>> word_groups = [word.split('/') for word in my_str.split(' ')]
>>> print [' '.join(words) for words in itertools.product(*word_groups)]
['Delete File', 'Delete Folder']

所以我可以定义各种调用:

var ajax = _.curry(function(method, request){
  if(request === undefined){
    request = {};
  }
  $.ajax({
    type: 'POST',
    url: getUrl(method),
    data: request,
  })
});

效果很好:

var insert = ajax('insert');
var update = ajax('update');
var del = ajax('delete');

但是,如果我在没有参数的情况下调用它,那么什么是行不通的 Curried函数称为:

insert({ id: 1, name: 'something' });

不调用Curried函数:

del({});

为什么?

1 个答案:

答案 0 :(得分:1)

我确信能比我更好地理解currying的人可以更深入地描述这一点。然而,我认为currying的方式是通过讨论一个函数,你打算涓涓细流"原始函数的参数。只有在插入了预期数量的参数后,才会调用原始函数。

现在抓住了这个问题:大多数例子只是在一个论点中涓涓细流,就像你正在尝试做的那样:

var curried = _.curry(function(foo, bar, baz){
    console.log(foo, bar, baz);
})
curried(1)(2)(3);
// -> 1 2 3

这一切都很好。但请注意,您可以这样做:

curried(1)(2,3);
// -> 1 2 3

你得到的结果相同。第二个和第三个参数一起流入。

所以你正在做的是这样的:

var fn = curried(1);
fn();

fn的调用是传递零参数,即你已经欺骗零参数,所以你将零参数推向你运行原始函数的目标。你可以整天打电话给fn(),它永远不会打电话给原来的咖喱功能。

如果你致电fn(undefined)它会(应该)有效,因为你实际上已经通过了一个论证,明确地是undefined

我不确定这只是一个lodash实现细节。我怀疑可能不会,因为如果您希望fn()能够正常工作,那么它如何无限地表示fn(undefined)fn(undefined, undefined)无效?