头等函数和高阶函数之间的任何区别


Answers:


154

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

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

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


2
我认为让我容易困惑的一件事是,它们是密切相关的。
西蒙(Simon)

63
@Simon我认为避免混淆的关键是要记住一种语言具有一流的功能(您也可以谈论“一流”的其他事物,例如一流的类等),否则就没有。因此,您永远不会谈论某个功能是否一流。OTOH,当您说一个函数是否为高阶时,仅表示该函数是否在函数上运行,因此“高阶性”是每个函数的属性。因此,“具有一流的功能”是语言的属性,“高级”是功能的属性。

完全是Ben。我当时以为这两者都是功能的属性,因此感到困惑。感谢您的评论。
西蒙(Simon)

另外,最好记住“一流的功能”与闭包支持不同。例如,在C语言中,通过函数指针支持“一流的函数”。但是,C不支持任何嵌套函数的概念,因此不支持闭包。
Tac-Tics 2012年

1
@ Tac-Tics,定义当然是主观的,并且有待讨论,但是我个人更倾向于认为C仅支持高阶函数(通过函数指针)。但是,不支持一流的函数,因为在任何情况下都无法(由函数体)显式定义函数,因此它们不如其他值类型(如int或)逊色。char
wlnirvana

67

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

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


20

他们不同。

一流的功能

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

支持功能类型的值并将其与非功能值相同的语言可以说是“一流的功能”。

高阶函数

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

典型的例子是“地图”

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

也就是说,它需要一个函数和一个数组,并返回一个将函数应用到每个元素的新数组。

功能语言-功能是构建程序的主要手段的语言-都具有一流的功能。大多数还具有高阶函数(极少数例外是像Excel这样的语言,可以说是功能性的,但不是高阶)。


1
谢谢唐。它很全面。我认为“后果之一”阶段表明了两者之间的某种关系。
西蒙(Simon)

10

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

另一方面,您可以想象支持高阶函数但不使函数成为一流的语言(并且对作为函数的参数进行特殊对待,并且不同于“普通”值参数)。

因此,一等函数(作为语言功能)的存在暗示着高阶函数的存在,反之则不然。


您能否举一个高阶函数不是一等函数的例子。(我认为两者都相同。)
ATHER

@ATHER,我没有一种具体的语言示例,可以针对此类功能进行这种设计选择。但是类似的情况也是如此,例如在C ++中使用模板:模板是高阶的(您可以具有“模板模板参数”),但是不是一等值,即模板不能是普通函数的参数。与ML中的模块/功能类似。
Andreas Rossberg

@AndreasRossberg Java 8不能有效回答他的问题吗?函数不是一等公民,但是Java方法可以(通过函数接口)接收函数,如您所描述的那样,“作为函数的参数经过特殊对待,与“普通”值参数不同”。
阿卜杜勒

1

头等舱功能可以:

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

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

例如:

function highOrderFunc() {
  return function () {
    alert('hello');
  };
}

0

一流的函数意味着您可以使用其他类型(变量,布尔值,数字...)进行的所有操作,您可以使用函数来进行处理。

例如,将它们分配给变量,将其传递,然后快速创建它们。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.