読者です 読者をやめる 読者になる 読者になる

生涯未熟

プログラミングをちょこちょこと。

第一級関数(ファーストクラスファンクション) is 何?となったので調べてみた

プログラミング言語Goを読んでいたのですが、その中で

Goはガベージコレクション、パッケージシステム、ファーストクラスの関数、レキシカルスコープ、システムコールインターフェイス、一般にはUTF-8エンコードされたテキストの不変文字列を持っています。

という一文がありました。

列挙された機能の中で ファーストクラスの関数 という部分だけが分からなかったので調べてみました。

ファーストクラスの関数 = 第一級関数

まず、前提としてファーストクラスの関数は第一級関数とも呼ばれています。

「第一級の関数?ってことは関数以外にもあるのか?」と調べると、 第一級オブジェクト というものがあることが分かりました。

第一級オブジェクト

第一級関数のことは一旦横に置いておいて、まずは第一級オブジェクトについて。

第一級オブジェクトとは以下の性質を持つオブジェクトのようです。 (参考:第一級オブジェクト - Wikipedia

  • 無名のリテラルとして表現可能である。
  • 変数に格納可能である。
  • データ構造に格納可能である。
  • それ自体が独自に存在できる(名前とは独立している)。
  • 他のものとの等値性の比較が可能である。
  • プロシージャや関数のパラメータとして渡すことができる。
  • プロシージャや関数の戻り値として返すことができる。
  • 実行時に構築可能である。
  • 表示可能である。
  • 読み込むことができる。
  • 分散したプロセス間で転送することができる。
  • 実行中のプロセスの外に保存することができる。

ふむふむ、小難しく書いてありますが要するに数値や文字列のように 関数の引数として渡す ことができたり 複合データ型(配列や連想配列、リスト)に格納できる 性質を持っているオブジェクトのことのようです。

また、この第一級オブジェクトは 第一級データ型に属するオブジェクト とも呼ばれます。

話は戻って第一級関数

第一級オブジェクトのことを学びましたが、ここで第一級関数に話を戻します。

ここまで来たら話は簡単で、 第一級オブジェクトとして扱うことができる関数 が第一級関数と呼ばれます。

ですので、例えばGolangでは以下のように関数を扱うことが可能です。

package main

import (
  "fmt"
)

func main() {
  shw := say_hello_world
  call_function(shw)
}

func call_function(f func()) {
  f()
}

func say_hello_world() {
  fmt.Println("Hello, World! :-)")
}

この場合、 say_hello_world という関数を shw という変数に格納し、 call_function の引数として扱えていることが分かります。

こういった扱い方が出来る関数を 第一級関数 と呼ぶのですね。勉強になりました。