【问题标题】:Any difference between First Class Function and High Order Function第一类函数和高阶函数之间的任何区别
【发布时间】:2012-04-25 20:02:20
【问题描述】:

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

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

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

【问题讨论】:

    标签: functional-programming terminology


    【解决方案1】:

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

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

    这两件事密切相关,因为很难想象一种语言具有一等函数但不支持高阶函数,反之,一种语言具有高阶函数但不支持一等函数。

    【讨论】:

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

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

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

    【讨论】:

      【解决方案3】:

      它们是不同的。

      一流的功能

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

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

      高阶函数

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

      典型的例子是“地图”

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

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

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

      【讨论】:

      • 谢谢唐。它是全面的。我认为“后果之一”阶段表明了这两者之间的某种关系。
      【解决方案4】:

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

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

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

      【讨论】:

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

      First Class函数可以:

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

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

      例如:

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

      【讨论】:

        【解决方案6】:

        一流的函数意味着你可以用其他类型(变量、布尔值、数字...)做的一切,你可以用函数来做。

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

        【讨论】:

          【解决方案7】:

          一级函数:

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

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

          高阶函数:

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

          【讨论】:

            猜你喜欢
            • 2013-09-14
            • 1970-01-01
            • 1970-01-01
            • 2021-04-29
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-07-26
            相关资源
            最近更新 更多