141

我想知道First Class FunctionHigh Order Function之间是否/有什么区别。

我通读了这两个 wiki 页面,它们看起来非常相似。如果他们谈论相同,为什么需要两个术语?

尝试谷歌但没有找到任何有用的东西。

4

7 回答 7

176

它们是有区别的。当您说一种语言具有一等函数时,这意味着该语言将函数视为值-您可以将函数分配给变量,将其传递等等。高阶函数是对其他函数起作用的函数,这意味着他们将一个或多个函数作为参数,也可以返回一个函数。

“高阶”概念通常可以应用于函数,例如数学意义上的函数。“一流”概念仅与编程语言中的函数有关。在指代函数时很少使用它,例如“一等函数”。更常见的说法是“一种语言有/没有一流的功能支持”。

这两件事是密切相关的,因为很难想象一种具有一流功能的语言不支持高阶函数,相反,一种具有高阶函数但没有一流函数支持的语言。

于 2012-04-13T13:07:22.383 回答
79

第一类函数是被视为对象(或可分配给变量)的函数。

高阶函数是将至少一个第一类函数作为参数或返回至少一个第一类函数的函数。

于 2012-04-13T12:59:36.257 回答
23

他们是不同的。

一级功能

在整个语言中统一处理的值称为“第一类”。它们可以存储在数据结构中,作为参数传递,或者在控制结构中使用。

支持具有函数类型的值并将它们视为非函数值的语言可以说具有“第一类函数”。

高阶函数

拥有一流函数的后果之一是您应该能够将函数作为参数传递给另一个函数。后一个功能现在是“高阶”。它是一个将函数作为参数的函数。

典型的例子是“地图”

map :: (a -> b) -> [a] -> [b]
map f []     = []
map f (x:xs) = f x : map f xs

也就是说,它接受一个函数和一个数组,并返回一个新数组,该数组将函数应用于每个元素。

函数式语言——其中函数是构建程序的主要手段的语言——都具有一流的函数。大多数还具有高阶函数(非常罕见的例外是像 Excel 这样的语言,可以说是函数式的,但不是高阶的)。

于 2012-04-13T13:35:41.873 回答
11

除了前面的答案,请注意具有一等函数的语言会自动启用高阶函数的表达式(因为您可以像传递任何其他值一样将函数作为参数传递)。

另一方面,您可以想象支持高阶函数但不将函数设为一等的语言(并且作为函数的参数被特殊处理,并且与“普通”值参数不同)。

因此,一等函数的存在(作为一种语言特征)意味着高阶函数的存在,但反之则不然。

于 2012-04-14T16:52:44.863 回答
4

一流的功能可以:

  • 存储在变量中
  • 从函数返回。
  • 作为参数传递给另一个函数。

高阶函数是一个返回另一个函数的函数。

例如:

function highOrderFunc() {
  return function () {
    alert('hello');
  };
}
于 2018-07-08T17:58:26.973 回答
0

一流的函数意味着您可以使用其他类型(变量、布尔值、数字......)做的所有事情,您可以使用函数来做。

例如,将它们分配给变量,传递它,即时创建它们。

于 2018-02-10T21:15:16.027 回答
0

一级功能:

当我们将函数作为另一个函数的参数传递时,称为第一类函数。将函数用作值的能力称为第一类函数。

var a = function(parameter){
    return function(){
    }
}
console.log(a())

高阶函数:

接收另一个函数作为参数或返回一个新函数或两者兼有的函数称为高阶函数。由于 First-class 函数,高阶函数才有可能。

于 2021-03-15T10:05:34.823 回答