ラムダ式
読み:ラムダしき
外語:lambda expression

 名前のない関数の表記法。ラムダ関数、あるいは単にラムダとも。
目次

概要
 計算を処理して一つの値を返すが、名前がない関数である。
 ラムダ計算をベースに考案された関数型プログラミング言語のLispの基盤となっている。
 その他のプログラミング言語でも続々導入されており、C#はC# 3.0から、C++C++11から導入された。

特徴
 例えばC++であれば、std::sort、std::for_eachなどを使うにあたって、比較関数の定義が必要である。このためにclassを定義したりといった無駄が発生することになるが、中でやることなど1行で済む計算式程度なので、std::sortなどの引数の中に関数が定義できれば便利である。この方法がラムダ式である。
 またKotlinの場合であれば、例えばAndroidプログラミングでリスナーの定義をする場合によく使われる。Javaであればリスナーを定義する関数の引数にリスナーそのものを入れる書き方がよくなされる。Better JavaであるKotlinも同様ではあるが、ここでJavaとは異なりラムダ式を記述することが可能で、これによってオーバーライドしたりする記述を大幅に減らすことができる。

記述方法
 記述方法は言語ごとに様々だが、関数定義の形式を取りながら名前を持たないのが特徴である。

C#
 C#では、C# 2.0から匿名メソッドというほぼ同等の機能が搭載されたが、これをよりシンプルで書きやすくしたものとして、C# 3.0からラムダ式が導入された。
 まず参考に、匿名メソッドの基本的な記述方法は、次のようなものである。
 delegate(int x, int y) { return x + y; }
 これと同様の機能を持つラムダ式は、次のように書かれる。
 (x, y) => x + y
 つまり、f(x)=x+1をx => x+1と書けるというものである。

C++11

文法
 C++でも、C++の第三版ISO/IEC 14882:2011(C++11)から導入された。但し書式はC#とは異なる。
 C++のラムダ式は、[]、()、{}、という三つのブロックで構成される。
 ラムダ式は()内の引数を取り{}内の処理を実行する無名の関数オブジェクトとして振る舞う。
 ラムダ式は関数であるので戻り値が存在するが、通常は型推論機能「decltype」が機能し(これもC++11からの新機能)、戻り値の型は省略することが可能。もし明示的に記述する場合は、[]()->type{}の構文になる。

使用例
 最も基本的な記述方法は、次のようなものである。
 [](int x, int y) { return x + y; }
 このラムダ式の返却値の型は、return文に書かれているx+yの型、つまりdecltype(x+y)である。
 返却値の型を明確にしたい場合は、次のように書くこともできる。
 [](int x, int y) -> int { return x + y; }
 クロージャー変数の定義も可能。
 int n = 123;
 [n](int x) -> int { return x * n; }

Kotlin
 Kotlinにおけるラムダ式の基本的な書式は次の通りである。
 val sum = { x: Int, y: Int -> x + y }
 つまり、{ 引数 -> 関数の中身 } のように記述することになる。{}内の引数の変数の型はオプションであり、推論可能な場合は省略できる。
 引数の型は外に出すこともでき、次のように書いても意味が同じになる。
 val sum: (Int, Int) -> Int = { x, y -> x + y }
 KotlinでAndroidプログラミングをする場合、例えばリスナーを設定する関数ごとに想定されたメソッドを使う場合には一々overrideの関数を書いたりする必要なく、ラムダ式を与えるだけで済む。

再検索