web-dev-qa-db-ja.com

ファーストクラス関数と高次関数の違い

First Class FunctionHigh Order Function の違いは何ですか?.

これらの2つのWikiページを読んでみると、かなり似ているように見えます。彼らが同じことを話しているのに、なぜ2つの用語が必要なのですか?

グーグルを試してみましたが、有用なものは見つかりませんでした。

120
Simon

違いがあります。言語に一流の関数があると言うとき、それは言語が関数を値として扱うことを意味します。変数に関数を割り当てたり、渡したりすることができます。高階関数は他の関数で機能する関数です。 1つ以上の関数を引数として受け取り、関数を返すこともできます。

「高次」概念は、数学的な意味での関数のように、一般的な関数に適用できます。 「ファーストクラス」の概念は、プログラミング言語の関数にのみ関係しています。 「ファーストクラスの機能」などの機能を指す場合、めったに使用されません。 「言語は、一流の機能をサポートしている/していない」と言う方がはるかに一般的です。

2つのことは密接に関連しています。これは、高階関数もサポートしないファーストクラス関数を備えた言語、および逆に高階関数を備えたファーストクラス関数をサポートしない言語を想像するのは難しいためです。

143
zoul

ファーストクラス関数は、オブジェクトのように扱われる(または変数に割り当て可能な)関数です。

高階関数は、少なくとも1つのファーストクラス関数をパラメーターとして取る関数です。

60
AshleyS

彼らは違います。

ファーストクラス関数

一貫して処理される言語の値は、「ファーストクラス」と呼ばれます。それらは、データ構造に格納されるか、引数として渡されるか、制御構造で使用されます。

関数型の値をサポートし、それらを非関数値と同じように扱う言語は、「ファーストクラス関数」を持つと言えます。

高階関数

ファーストクラス関数を使用することの結果の1つは、関数を引数として別の関数に渡すことができるようになることです。後者の関数は現在「高次」です。関数を引数として取る関数です。

標準的な例は「マップ」です

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

つまり、関数と配列を受け取り、各要素に関数が適用された新しい配列を返します。

関数型言語(関数をプログラム構築の主要な手段とする言語)にはすべて、ファーストクラスの関数があります。ほとんどには高階関数もあります(Excelのような言語である非常にまれな例外は機能的であると言えますが、高階ではありません)。

20
Don Stewart

前の回答に加えて、一流の関数を持つ言語では、高次関数の式が自動的に有効になります(関数を他の値と同様にパラメーターとして渡すことができるため)。

一方、高階関数をサポートしているが、関数をファーストクラスにしない言語を想像できます(関数であるパラメーターが特別に扱われ、「通常の」値パラメーターとは異なる場合)。

(言語機能としての)ファーストクラス関数の存在は、高次関数の存在を意味しますが、その逆ではありません。

9

ファーストクラスの関数とは、他の型(変数、ブール値、数字など)でできることすべてを意味します。関数でそれを行うことができます。

たとえば、変数に変数を割り当て、それを渡し、その場で作成します。

0
Ishan Patel

ファーストクラス関数は次のことができます:

  • 変数に保存される
  • 関数から返されます。
  • 別の関数に引数として渡されます。

高次関数は、別の関数を返す関数です。

例えば:

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