私は思ったんだけどどうか/の間にどのような違いファーストクラスの機能と高階関数。
私はこれら2つのWikiページを読みましたが、どちらもかなり似ています。同じことを言っているのに、なぜ2つの用語が必要なのでしょうか。
グーグルを試してみましたが、有用なものは見つかりませんでした。
私は思ったんだけどどうか/の間にどのような違いファーストクラスの機能と高階関数。
私はこれら2つのWikiページを読みましたが、どちらもかなり似ています。同じことを言っているのに、なぜ2つの用語が必要なのでしょうか。
グーグルを試してみましたが、有用なものは見つかりませんでした。
回答:
違いがあります。言語にファーストクラスの関数があると言うとき、それはその言語が関数を値として扱うことを意味します。つまり、関数を変数に割り当てたり、渡したりすることができます。高階関数は、他の関数で機能する関数です。 1つ以上の関数を引数として取り、関数を返すこともできます。
「高次」の概念は、数学的な意味の関数のように、関数全般に適用できます。「ファーストクラス」の概念は、プログラミング言語の関数とのみ関係があります。「ファーストクラスの関数」などの関数を参照するときはめったに使用されません。「ある言語はファーストクラスの関数をサポートしている/持っていない」と言う方がはるかに一般的です。
高次関数もサポートしないファーストクラスの関数を備えた言語や、逆に高次関数を備えたがファーストクラスの関数をサポートしていない言語を想像するのは難しいため、この2つは密接に関連しています。
int
やのような他の値の型よりも劣っています。つまりchar
、どこでも(関数の本体によって)明示的に定義できないからです。
彼らは違います。
ファーストクラスの機能
言語全体の値が一律に処理される値は、「ファーストクラス」と呼ばれます。それらは、データ構造に格納されるか、引数として渡されるか、制御構造で使用されます。
関数型の値をサポートし、それらを非関数値と同じように扱う言語は、「ファーストクラス関数」を持つと言えます。
高次関数
ファーストクラスの関数があることの結果の1つは、関数を引数として別の関数に渡すことができるはずです。後者の関数は「高次」になりました。関数を引数として取る関数です。
正規の例は「マップ」です
map :: (a -> b) -> [a] -> [b]
map f [] = []
map f (x:xs) = f x : map f xs
つまり、関数と配列を受け取り、各要素に関数が適用された新しい配列を返します。
関数型言語(関数がプログラムを構築する主要な手段である言語)はすべて、ファーストクラスの関数を備えています。ほとんどはより高次の関数も持っています(Excelのような言語は非常にまれな例外であり、機能的であると言えますが、より高次ではありません)。
前の回答に加えて、ファーストクラスの関数を使用する言語では、高次関数の式が自動的に有効になることに注意してください(関数を他の値と同様にパラメーターとして渡すことができるため)。
一方、高階関数をサポートするが、関数をファーストクラスにしない(そして関数であるパラメーターが特別に扱われ、「通常の」値パラメーターとは異なる)言語を想像できます。
したがって、(言語機能としての)ファーストクラス関数の存在は、高次関数の存在を意味しますが、その逆は意味しません。