ChatGPT解决这个技术问题 Extra ChatGPT

第一类函数和高阶函数之间的任何区别

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

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

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


z
zoul

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

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

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


我认为让我很容易混淆的一件事是它们密切相关。
@Simon我认为避免混淆的关键是记住一种语言要么具有一流的功能(您也可以谈论“一流”的其他事物,例如一流的课程等),或者没有。所以你永远不会谈论一个特定的功能是否是一流的。 OTOH,当你说一个函数是否是高阶函数时,它只是说它是否对函数进行操作,所以“高阶”是每个单独函数的属性。所以“具有一等函数”是一种语言的属性,而“是高阶的”是一种函数的属性。
正是本。我在想这两个都是函数的属性,所以我很困惑。谢谢你的意见。
@Tac-Tics 的定义当然是主观的并且有待商榷,但我个人更倾向于认为 C 只支持高阶函数(通过函数指针)。但是,不支持一等函数,因为函数不如 intchar 等其他值类型,因为无论您在何处都无法显式定义(由函数体)想。
你(@Ben)总结的方式'所以“具有一流的功能”是一种语言的属性,而“是高阶的”是一种功能的属性太棒了。将 first-class functions 更改为 has first-class functions 是绝妙的一招。
C
Community

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

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


D
Don Stewart

他们是不同的。

一级功能

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

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

高阶函数

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

典型的例子是“地图”

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

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

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


谢谢唐。它是全面的。我认为“后果之一”阶段表明了这两者之间的一种关系。
A
Andreas Rossberg

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

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

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


您能否举一个高阶函数不是一等函数的例子。 (我以为两者都是一样的。)
@ATHER,我没有具体的语言示例可以为此类功能做出这样的设计选择。但是类似的情况是,例如 C++ 中的模板:模板是高阶的(你可以有“模板模板参数”),但不是一等值,即模板不能是普通函数的参数。与例如 ML 中的模块/函子类似。
@AndreasRossberg Java 8 不是他问题的有效答案吗?函数不是一等公民,但 Java 方法可以接收函数(通过函数式接口),正如您所描述的“作为函数的参数被特殊处理,并且不同于“普通”值参数。”
t
techkuz

一流的功能可以:

存储在变量中

从函数返回。

作为参数传递给另一个函数。

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

例如:

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

I
Ishan Patel

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

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


T
Tomerikoo

一级功能:

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

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

高阶函数:

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