無名関数

出典: フリー百科事典『ウィキペディア(Wikipedia)』
移動: 案内検索

無名関数(anonymous[1] function, nameless function)とは、名前付けされずに定義された関数のことである。無名関数を表現するための方法には様々なものがあるが、近年主流なのはラムダ式による記法である。無名関数を表現するリテラル式は、関数リテラル(function literal)とも呼ばれる。値がある場合は関数オブジェクトであるものが多い。

ラムダ式[編集]

ラムダ式(lambda expression)はラムダ計算と関係が深く、関数型言語で特によく採用されている。C++11においても導入された。 Haskellにおける記法はこうである。

(\x y -> x + y) 2 3 == 5 --二つの引数を取ってその和を返す関数。

匿名メソッド[編集]

C# 2.0で導入された。[2]

//ボタンを押すとメッセージが表示される
button1.Click += delegate(System.Object o, System.EventArgs e)
                   { System.Windows.Forms.MessageBox.Show("Click!"); };

C# 3.0以降ではラムダ式も導入されている。ラムダ式のほうが表現の幅が広く、基本的にC#ではラムダ式を用いる。 ただし、匿名メソッドではパラメーターリストを省略できるので、匿名メソッドはさまざまなシグネチャを持つデリゲートに変換でき、ラムダ式では出来ない。この点において匿名メソッドはラムダ式に勝っている。

JavaScriptの無名関数[編集]

JavaScriptではfunctionというキーワードを用いて記述する。

(function(a,b){return a+b;})(2,3) == 5 //二つの引数を取ってその和を返す関数。

Luaの無名関数[編集]

Luaにおける関数は第一級オブジェクトであり、すべての関数が本質的に無名関数である。名前付きの関数とは、関数オブジェクトへの参照を保持する変数にすぎない。

function foo(x) return 2*x end

というコードは、次のコードに対する糖衣構文である。

foo = function(x) return 2*x end

Pythonの無名関数[編集]

Pythonではlambdaというキーワードを使う。Python特有の注意点として、lambdaの内容には式のみが書け、文は書けない点が挙げられる。

(lambda a, b: a + b)(2, 3) == 5 #二つの引数を取ってその和を返す関数。

無名関数の特徴[編集]

  • 名前で参照できないため、再帰のためには何らかのテクニックがほぼ必要になる(無名再帰を参照)。

メリット[編集]

  • 一度しか使わない関数の名前を付けなくて済む。名前の衝突を考えなくて済む。
  • 関数の引数などに直接渡せる。

参考文献[編集]

  • Anonymous function - HaskellWiki [1]
  • 匿名関数 (C# プログラミング ガイド) [2]

脚注[編集]

  1. ^ 「anonymous」は「匿名」と訳されることも多いが、「匿名」は名前を匿(かく)すことを意味するのでこの場合不適切である。この場合の「anonymous」は「名前が分からない」ということを意味しているので「無名」が適切な訳である。
  2. ^ MSDNでは「匿名」としているので、この節はそれに従った。