Help us understand the problem. What is going on with this article?

ラムダ式とは

More than 1 year has passed since last update.

ラムダ式とは

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

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

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

ということ。

例えば、引数に値をとり、それに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つは分けて考えたほうが良いですね。

kiyo-tomo
I am a Japanese engineer. In the second year after graduating from university, I experienced a career change from SIER.
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away