高阶函数与第一型_Higher-order function and First-class object

在数学和计算机科学中,高阶函数是至少满足下列一个条件的函数:

  • 接受一个或多个函数作为输入
  • 输出一个函数
    在数学中它们也叫做运算符或泛函。微积分中的导数就是常见的例子,因为它映射一个函数到另一个函数.

例如:函数f(x) = x2;函数f(x)的导数为2x;2x也为一个函数,所以导数是高阶函数.

wiki中关于第一型介绍如下:

a first-class citizen (also object, entity, or value), in the context of a particular programming language, is an entity that can be constructed at run-time, passed as a parameter, returned from a subroutine, or assigned into a variable. In computer science the term reification is used when referring to the process (technique, mechanism) of making something a first-class object.

第一型,在特定编程语言上下文中,是一个在运行时能够构建的实体,作为一个参数传递,返回子程序,或者赋值给一个变量.在计算机科学中,这个词具体指一个过程(技术,机制)使得某事物成为第一类型对象.

同样在Automatic memoization中也有关于第一型对象的介绍:

In programming languages where functions are first-class objects (such as Lua, with its first-class functions, Python, or Perl [1]), automatic memoization can be implemented by replacing (at run-time) a function with its calculated value once a value has been calculated for a given set of parameters. The function that does this value-for-function-object replacement can generically wrap any referentially transparent function.

在函数是第一型的编程语言中(比如lua,和其第一型函数,Python,或者Perl),自动制表能够这样实现:一旦一个函数为给出了一系列的参 数作了计算,用函数的计算值来替换函数本身.函数的 value-for-function-object替换通常能够包装任何涉及的函数.

以一个g(f,7)= (7+3)×(7+3)的函数为例,其中f(x) = x+3 是里面作为参数的函数,同样作为函数返回,f(x)是第一型函数.

函数式语言中的高阶函数实现

该函数的Python的实现为:

def f(x):
return x + 3

def g(function, x):
return function(x) * function(x)

print g(f, 7)

同样具有函数式语言特性的javascript的实现也很简单:

function f(x){
return x + 3;
}
function g(func, x){
return func(x) * func(x);
}
alert(g(f, 7));

而java不具备函数式语言的特性,但是可以用接口和泛型来进行模拟,具体介绍如下:

java中的高阶函数实现

首先新建接口 Func.java

package com.func;
public interface Func<R,P> {
//这里的R和P可以是java中各种主要类型,apply作为要实现的函数.
public R apply(P param);
}

在类PlusThree.java中我们可以实现f(x) = x+3这个函数.

package com.func;

public class PlusThree implements Func<Double, Double> {
public Double apply(Double param) {
return param + 3;
}
}

Test.java中则实现g(x)函数

package com.func;

public class Test {
//静态方法g实现g(x) = f(x)f(x)这个函数
public static Double g(Func<Double, Double> f, double x1) {
return f.apply(x1)
f.apply(x1);
}

public static void main(String[] args) {
//调用实现的函数来作为参数进行运算
System.out.println(g(new PlusThree(), 7));
//通过一个匿名类来实现f(x)=x+3这个函数
System.out.println(g(new Func<Double, Double>() {
public Double apply(Double param) {
return param + 3;
}
}, 7));
}
}