ラムダ式

読み:ラムダしき
外語: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の関数を書いたりする必要なく、ラムダ式を与えるだけで済む。

用語の所属
関数
関連する用語
C++
ラムダ計算

コメントなどを投稿するフォームは、日本語対応時のみ表示されます


KisoDic通信用語の基礎知識検索システム WDIC Explorer Version 7.04a (27-May-2022)
Search System : Copyright © Mirai corporation
Dictionary : Copyright © WDIC Creators club