我目前正在尝试自己讨论并且对空参数有疑问 我有一个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({});
为什么?
答案 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)
无效?