141

First Class FunctionHigh Order Functionの違いがあるかどうか疑問に思っています。

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

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

4

7 に答える 7

176

違いがあります。言語にファーストクラスの関数があると言うとき、それはその言語が関数を値として扱うことを意味します。つまり、関数を変数に割り当てたり、渡したりすることができます。高階関数は、他の関数で動作する関数です。つまり、引数として 1 つ以上の関数を取り、関数を返すこともできます。

「高次」の概念は、数学的な意味での関数と同様に、関数全般に適用できます。「一流」の概念は、プログラミング言語の関数にのみ関係があります。「ファーストクラス関数」などの関数を参照するときに使用されることはめったにありません。「言語にはファーストクラスの関数サポートがある/ない」と言う方がはるかに一般的です。

高階関数をサポートしない第一級関数を備えた言語と、逆に高階関数を備えているが第一級関数をサポートしていない言語を想像するのは難しいため、この 2 つのことは密接に関連しています。

于 2012-04-13T13:07:22.383 に答える
79

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

高階関数は、パラメーターとして少なくとも1つの第一級関数を受け取る関数、または少なくとも1つの第一級関数を返す関数です。

于 2012-04-13T12:59:36.257 に答える
23

彼らは違います。

ファーストクラス関数

全体を通して均一に扱われる言語の値は、「ファースト クラス」と呼ばれます。それらは、データ構造に格納されたり、引数として渡されたり、制御構造で使用されたりする場合があります。

関数型を持つ値をサポートし、それらを関数以外の値と同じように扱う言語は、「第一級関数」を持っていると言えます。

高階関数

第一級関数を持つことの結果の 1 つは、関数を引数として別の関数に渡すことができる必要があるということです。後者の関数は「高次」になりました。関数を引数にとる関数です。

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

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

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

関数型言語 (プログラムを構築する主な手段が関数である言語) はすべて、第一級の関数を備えています。ほとんどの関数には高次関数もあります (非常にまれな例外として、Excel などの言語は機能的であると言えますが、高次関数ではありません)。

于 2012-04-13T13:35:41.873 に答える
11

前の回答に加えて、ファーストクラスの関数を持つ言語では、高階関数の式が自動的に有効になることに注意してください (関数を他の値と同様にパラメーターとして渡すことができるため)。

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

したがって、(言語機能としての) 第一級関数の存在は、高階関数の存在を意味しますが、その逆ではありません。

于 2012-04-14T16:52:44.863 に答える