本文へ移動

無名関数(ラムダ・名前なし関数)

無名関数(ラムダ)の定義、構文、歴史、主な用途、対応言語、および名前付き関数との違いを解説する。

概要

無名関数とは、明示的な名前を持たない関数定義である。識別子を付けて宣言し、後からその名前で呼び出すのではなく、定義した場所に直接記述してそこで使用する。このような構文は、多くのプログラミング環境でラムダ、ラムダ式、または関数リテラルと呼ばれる。単純な数学的例では、f(x) = x² − x + 42 のような名前付きの形式に対し、x → x² − x + 42 という無名の表記を対比できる。無名関数により、関数を渡す、返す、保存するといった値として自然に扱えるようになる。

特徴と構文

無名関数は通常、短い本体を持ち、局所的で、多くの場合は一度だけ使う目的で用いられる。高階関数への引数、戻り値、インラインのハンドラとして記述できる。言語によって、無名関数は関数値を生成する式、リテラルとしてのラムダ、あるいはクロージャを作成するための構文上の簡略表現となる。決定的な特徴はグローバルまたはトップレベルの名前を持たないことだが、再利用のために変数へ代入したり、データ構造に格納したりすることはできる。多くの無名関数は周囲の環境から変数を捕捉し、外側のスコープを抜けた後もそれらの変数への参照を保持するクロージャを形成する。

歴史と理論的起源

無名関数の考え方は、名前付きルーチンを使わずに計算を表現する方法として、1930年代に数理論理学で発展したラムダ計算などの形式体系に由来する。実用的なプログラミングでは、初期の関数型言語やLisp系のシステムが、名前のない手続きを直接渡すスタイルを広めた。現在、無名関数は複数のパラダイムで利用できる。関数型プログラミングの実践の一部であると同時に、命令型言語やオブジェクト指向言語でも、振る舞いを簡潔に表す手段として広く使われている。両分野の背景については、コンピュータ科学および数学を参照。

用途と例

無名関数は、簡潔なコールバックやイベントハンドラ、ならびに map、filter、reduce などの関数型操作でよく使われる。一度だけ必要となる小さな操作を記述する場合に、コードを簡潔にできる。典型例としては、短い比較関数をソートルーチンへ渡すこと、コレクションの各要素に対する変換をインラインで定義すること、非同期操作のコールバックを設定することなどがある。無名関数をサポートする言語には、以下のものが含まれるが、これらに限られない。

  • JavaScript — 関数式とアロー関数
  • Python — ラムダ式
  • HaskellおよびML系言語 — ラムダが中核的な構文である
  • JavaおよびC# — ラムダ式とデリゲート
  • LispおよびScheme — 無名ラムダが長く使用されてきた

相違点と注目すべき事実

無名であっても、この種の関数は変数やオブジェクトのプロパティに束縛でき、その結果としてプログラム内で事実上の名前を得られる。名前付き関数とは、スタックトレースでは情報量の少ないフレームが表示されることがある点や、再帰では自己参照に名前付きの束縛が必要になることが多い点など、実用上の側面で異なる。ラムダが大きくなると可読性やデバッグのしやすさが損なわれることがあるため、簡潔に保つのが望ましい。無名関数は振る舞いを組み合わせるための汎用的な構成要素であり、多くの現代的な言語において、簡潔で表現力のあるコードパターンを可能にする。

関連項目

著者

AlegsaOnline.com 無名関数(ラムダ・名前なし関数)

URL: https://ja.alegsaonline.com/art/4495

共有