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で書く