プログラミングにおけるファーストクラスオブジェクト
定義
プログラミングにおいて、ファーストクラスオブジェクトは、次の条件を満たす要素をいう。
- (i) 関数の実際の引数となり得る。
- (ii) 関数の戻り値となり得る。
- (iii) 代入文の対象となり得る。
- (iv) 等値比較の対象となり得る。
例
簡単に言えば、通常の数のように扱えるものをファーストクラスオブジェクトというが、これは明らかに’通常の数’がファーストクラスオブジェクトだからである。整数 $3$ を例に取ると、
- (i) ある関数 $f$ に対して $f(3)$ のように引数となり得る。
- (ii) $n$ 番目のフィボナッチ数を返す関数 $\text{fibo}$ に対して $\text{fibo}(4) = 3$ のように返される。
- (iii) $x = 3$ のように代入される。
- (iv) $3==4$ のように等しいか等しくないかを比較できる。
数学者向け説明
ファーストクラスオブジェクトの概念は主に関数型言語を説明するために言及される。数学的に見た場合、ファーストクラスオブジェクトという概念自体が奇妙と思われるかもしれない。数学で言う関数の定義に従えば、ほとんどのオブジェクトは当然ファーストクラスオブジェクトであるべきだ。関数自体がある集合の元であり、その関数を変数として持ち値が関数であり、関数を定義したり、関数を比較することは十分に可能であるべきだ。
しかし、これは数学の話である。見方は人それぞれだが、一般にプログラミングはコンピュータ科学の領域にあり、異なる分野である。これらの説明を容易に受け入れるためには、十分に数学や抽象的な論理に慣れている必要がある1。
実際に、高校のカリキュラムをちょうど終えた学習者であっても、関数をオブジェクトとして見ることは自然ではないかもしれない。数学者にとっては、関数$f(x) = x^2 + 1$が二次関数集合の要素$f \in p_{2}(x)$であったり、連続関数の集合の要素$f \in C(\mathbb{R})$と見えるかもしれないが、カリキュラムレベルの抽象化能力だけを持っていれば、$x$を入れたときに$x^2+1$が返される概念として受け入れれば十分だからだ。
工学者向け説明
関数同士を足すこと―関数の加算によって関数が返されることは、ベクトル空間を知っていれば自然だが、実際にそこまで知らなくても充分に受け入れられる。しかし、関数自体が入力値となるというのは、直ちに想像しにくいかもしれない。次の関数$I$を新たに定義してみよう。 $$ I(f) := \int_{0}^{6} f(x) dx $$ 関数$I$は、ある関数を引数として受け取り、$0$から$6$までの定積分を求める関数である。すると、「入力される」関数によってその「戻り」は次のように計算されるだろう。 $$ f(x) = x^2+1 \implies I(f) = 78 \\ g(x) = x-1 \implies I(g) = 12 $$ このように、関数そのものがファーストクラスオブジェクトであれば、関数型言語の一つの性質を持つと言える。これだけで関数型言語と呼ばれるわけではなく、命令型言語であってもこのような概念を受け入れる言語は徐々に増えている。もちろん、ある意味で「関数型言語である」と表現しても、意味の伝達自体には大きな問題はない。
実際に、プログラマーの視点からファーストクラスオブジェクトを説明した文章では、具体的にどのような言語を例に挙げることが多い。 ↩︎