Posted at

ラムダ式とは


ラムダ式とは

関数型言語由来の概念。

関数型言語とは「関数を値と同じ様に扱える」言語。

"値"というのは数値とか文字列とかリストとか。

値と同じ様に扱えるとは、


  • 変数に代入できて

  • 関数の引数に渡せて

  • 関数の戻り値にできる

ということ。

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

F(x) = x + 10

のような関数。

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

では、上記の関数を変数に代入するにはどうすればよいか。

この「値として取り回せる関数の書き方」がラムダ式。

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

 f = x -> x + 10

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

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

この書き方は言語により異なるが、どれもラムダ式である。

どれも「値として取り回せる関数の書き方」を定義したものだから。

-> とか => とか細かな書き方の違いは関係ありません。

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

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

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

例えばJavaで

Function<Integer, Integer>f = new Funciton<>(){

public Integer apply(Integer x){
return x + 10;
}
}

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

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

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


  • 「そもそもラムダ式とはなんなのか」

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

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