ラムダ式とは何かを簡単に説明する

2019年11月3日

ラムダ式とは

関数型言語由来の概念。
関数型言語とは「関数を値と同じ様に扱える」言語。

"値"というのは数値とか文字列とかリストとか。
値と同じ様に扱えるとは、

  • 変数に代入できて
  • 関数の引数に渡せて
  • 関数の戻り値にできる

ということ。

例えば、引数に値をとり、それに10を足して返す関数

F(x) = x + 10

のような関数。
関数型言語ではこの関数を値として取り回せる。

では、上記の関数を変数に代入するにはどうすればよいか。
この「値として取り回せる関数の書き方」がラムダ式。

例えば、関数型言語のHaskellでは上記の関数は

 f = x -> x + 10

というふうに記述できる。

「【数値xを受け取り、それに10を足した値を返す関数】を、fという変数に代入した」と思って下さい。

この書き方は言語により異なるが、どれもラムダ式である。
どれも「値として取り回せる関数の書き方」を定義したものだから。
-> とか => とか細かな書き方の違いは関係ありません。

と、ここまでがラムダ式の話なのだがJavaやC#では少々事情が異なる。

これらはクラスあっての言語なので関数はクラスの中、つまりメソッドという形でしか存在できないからです。

なので、function(C#だとFunc)インターフェイス(C#はデリゲート)を作り、擬似的に関数として取り回せる様にしている。

例えばJavaで

Function<Integer, Integer>f = new Funciton<>(){
    public Integer apply(Integer x){
        return x + 10;
    }
}

の省略記法に過ぎないわけです。

単なるインスタンスなので、変数に代入できるし、引数にも戻り地にも出来る、というわけです。

以上がラムダ式の説明になります。

  • 「そもそもラムダ式とはなんなのか」
  • 「(関数型言語由来の概念である)ラムダ式を、オブジェクト志向言語に落とし込むには?」

がごっちゃになると一気にわけがわからなくなるので、この2つは分けて考えたほうが良いですね。