TL;DR

名前(識別子)に束縛されていない関数の定義。関数リテラル、ラムダ関数、ブロックとも呼ぶ。高階関数に渡す引数としてよく使われる。

なぜ必要か

一度しか使わない短い処理なら、名前付きの関数を別に定義するより、その場に書いたほうが軽く読みやすい。sort、map、filter、fold などの高階関数に渡して振る舞いを変えるときや、関数を返す高階関数の戻り値を作るときに使う。どの無名関数も名前付きの関数で置き換えられるので、使うかどうかはスタイルの問題である。

仕組み

Alonzo Church が 1936 年に考えたラムダ計算では、すべての関数が無名である。プログラミング言語では、1958 年の Lisp から無名関数が使われている。無名関数が定義された環境の変数を捕まえると、クロージャになる。

例

言語ごとに書き方が異なる。

  • Python: lambda x: len(x)。式しか書けず、文は書けない
  • JavaScript: x => x + 1(アロー関数)
  • Gleam: let add_one = fn(a) { a + 1 }。名前付きの関数と同じく add_one(1) で呼び出せる
  • Lua: 名前付きの関数と同じく function ~ end で書く

関連

出典