这个高阶函数叫什么?

时间:2012-11-24 06:20:37

标签: javascript coding-style functional-programming naming-conventions

我怀疑是什么叫做转换函数的高阶函数,所以它使用数组而不是参数列表。用文字解释很复杂,所以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

5 个答案:

答案 0 :(得分:2)

Scala函数有一个类似的方法,它采用n-ary函数并返回一个以n元组为唯一参数的一元函数。他们调用方法tupled,您可以在documentation for Function5(或任何其他大于1的函数arities)中看到它。

答案 1 :(得分:1)

在经典的 Javascript:The Good Parts 中,它被引用为 apply invocation pattern ,这是Javascript中四种调用模式之一。

答案 2 :(得分:1)

似乎没有任何通常使用的术语。

Javascript bind method包含这样的函数调用,并且没有使用特殊术语。

Prototype bind method做同样的事情,也没有任何术语。

jQuery proxy method做同样的事情,也没有任何术语。

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

答案 3 :(得分:1)

因为您似乎在问“为了便于阅读,我应该将此功能称为什么?” verus“这是什么类型/功能分类?”,我将投入两分钱:

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);

答案 4 :(得分:0)

我称之为variadic function。如果你不熟悉,可变参数函数会获取一个参数列表,并允许程序员以数组的形式与它们进行交互。

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

Variadic函数以几种不同的语言出现,我的最爱包括:

  • C-var_args
  • d
  • 开始

D网站有一个很好的介绍:http://dlang.org/function.html(搜索可变参数)

修改

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

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

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