3

我怀疑如何调用转换函数的高阶函数,以便它使用数组而不是参数列表。用语言解释起来很复杂,所以在 JavaScript 中有一个例子:

sum = function(a,b){ return a+b; };
foo = function(fn){
    return function(arr){
        return fn.apply(fn,arr);
    };
};
different_sum = foo(sum);
log(sum(2,3)); //5
log(different_sum([2,3])); //5
4

5 回答 5

2

Scala 函数有一个类似的方法,它接受一个 n 元函数并返回一个将 n 元组作为唯一参数的一元函数。他们调用 method tupled,您可以在文档Function5中看到它(或任何其他大于 1 的函数)。

于 2012-11-24T06:28:55.243 回答
1

在经典的Javascript: The Good Parts中,这被称为应用调用模式,是 Javascript 中的四种调用模式之一。

于 2012-11-24T06:27:24.097 回答
1

似乎没有任何普遍使用的术语。

Javascriptbind方法包装了这样的函数调用,没有使用特殊术语。

Prototypebind方法也是如此,那里也没有术语。

jQueryproxy方法的作用相同,也没有术语。

解释中使用了术语“包装”,但这当然是一个更广泛的术语。

于 2012-11-24T06:41:36.410 回答
1

因为您似乎在问“为了便于阅读,我应该怎样称呼这个函数?” 验证“这是什么类型/分类的功能?”,我会投入两分钱:

remixInputMethod()

实际上,这只是重新连接函数用户与程序交互的方式的问题。我想像这样的东西在你想要与它交互的程序中会很有用,方法是传入不同于你希望用户与之交互的方式的输入。

this.sum = function(a,b){ return a+b; };
remixInputMethod = function(fn){
    return function(arr){
        return fn.apply(fn,arr);
    };
};
var _sum = remixInputMethod(this.sum);

// Throughout your program, do some more advanced, funky stuff
var sums = (function buildListOfSums(num){
    var arr = [], output = 0;
    while(num--){
        arr.push(num);
    }

    while(arr.length > 2){
        output += _sum([arr[arr.length - 1], arr[arr.length - 2]]);
        arr.pop(arr[arr.length - 1]);
        arr.pop(arr[arr.length - 2]);
    }
    return output;
}(20));
console.log(sums);

// But for the user, lets say, who downloaded your API on Github and is using it to
// build their first webpage for their uncle
// who thinks they are smarter than bill gates
sum(1,2);
于 2012-11-24T07:23:50.047 回答
0

我将其称为可变参数函数。如果您不熟悉,可变参数函数采用参数列表并允许程序员将它们作为数组进行交互。

由于 Javascript 不支持可变参数函数,fn.apply(context, args)因此是实现它的方法。我不认为实际的实现很重要。

可变参数函数出现在几种不同的语言中,我最喜欢的包括:

  • C- var_args
  • D

D网站有一个相当不错的介绍:http ://dlang.org/function.html (搜索variadic)

编辑:

您的示例与可变参数函数完全相反。它不是采用 n 个参数并将它们作为数组进行交互,而是将一组参数作为单独的参数与它们进行交互。

我仍然认为这实际上与可变参数函数相同,因为它接受可变数量的参数,但它只是改变了您与这些参数交互的方式。

可能有一个更好的术语,但也许我们可以称它为inverse variadic function?

于 2012-11-24T06:37:51.320 回答