【发布时间】:2012-04-25 20:02:20
【问题描述】:
我想知道First Class Function 和High Order Function 之间是否/有什么区别。
我通读了这两个 wiki 页面,它们看起来非常相似。 如果他们谈论相同,为什么需要两个术语?
尝试谷歌但没有找到任何有用的东西。
【问题讨论】:
标签: functional-programming terminology
我想知道First Class Function 和High Order Function 之间是否/有什么区别。
我通读了这两个 wiki 页面,它们看起来非常相似。 如果他们谈论相同,为什么需要两个术语?
尝试谷歌但没有找到任何有用的东西。
【问题讨论】:
标签: functional-programming terminology
有区别。当您说一种语言具有一等函数时,这意味着该语言将函数视为值-您可以将函数分配给变量,将其传递等等。高阶函数是对其他函数起作用的函数,这意味着他们接受一个或多个函数作为参数,也可以返回一个函数。
“高阶”概念可以应用于一般的函数,例如数学意义上的函数。 “一流”概念仅与编程语言中的函数有关。在指代函数时很少使用它,例如“一等函数”。更常见的说法是“一种语言有/没有一流的功能支持”。
这两件事密切相关,因为很难想象一种语言具有一等函数但不支持高阶函数,反之,一种语言具有高阶函数但不支持一等函数。
【讨论】:
int 或char 等其他值类型,因为它们不能显式定义(通过函数体)想要。
first-class functions 更改为has first-class functions 是绝妙的一招。
一等函数是被视为对象(或可分配给变量)的函数。
高阶函数是将至少一个第一类函数作为参数的函数,或返回至少一个第一类函数。
【讨论】:
它们是不同的。
一流的功能
一种语言中统一处理的值称为“一流”。它们可以存储在数据结构中,作为参数传递,或者在控制结构中使用。
支持具有函数类型的值,并将它们视为非函数值的语言,可以说是具有“第一类函数”。
高阶函数
拥有一流函数的一个后果是您应该能够将一个函数作为参数传递给另一个函数。后一个功能现在是“高阶”。它是一个以函数为参数的函数。
典型的例子是“地图”
map :: (a -> b) -> [a] -> [b]
map f [] = []
map f (x:xs) = f x : map f xs
也就是说,它接受一个函数和一个数组,并返回一个新数组,其中函数应用于每个元素。
函数式语言——其中函数是构建程序的主要手段的语言——都具有一流的函数。大多数还具有高阶函数(非常罕见的例外是像 Excel 这样的语言,可以说是函数式的,但不是高阶的)。
【讨论】:
除了前面的答案,请注意,具有一等函数的语言会自动启用高阶函数的表达式(因为您可以像传递任何其他值一样将函数作为参数传递)。
另一方面,您可以想象支持高阶函数但不将函数设为一等的语言(并且作为函数的参数被特殊处理,并且与“普通”值参数不同)。
因此,一等函数的存在(作为一种语言特性)意味着高阶函数的存在,但反之则不然。
【讨论】:
First Class函数可以:
高阶函数是一个返回另一个函数的函数。
例如:
function highOrderFunc() {
return function () {
alert('hello');
};
}
【讨论】:
一流的函数意味着你可以用其他类型(变量、布尔值、数字...)做的一切,你可以用函数来做。
例如将它们分配给变量,传递它,即时创建它们。
【讨论】:
当我们将函数作为另一个函数的参数传递时,称为第一类函数。 将函数用作值的能力称为第一类函数。
var a = function(parameter){
return function(){
}
}
console.log(a())
接收另一个函数作为参数或返回一个新函数或两者兼有的函数称为高阶函数。高阶函数只有在 First-class 函数的作用下才有可能。
【讨论】: