匿名ラムダ関数(関数型プログラミング)


10

匿名(ラムダ)関数とは何ですか?関数型プログラミング言語における無名関数の正式な定義は何ですか?

簡単に言うと、scheme / lispでプログラミングしているとき、匿名(ラムダ)関数は識別子にバインドされていない関数だと思います。

ラムダ関数について正式に言えるのはそれだけですか?この単純な定義に追加できる詳細があると思います。詳しく説明していただき、ありがとうございます。


回答:


10

私の意見では、あなたがそれらについて本当に言えることはそれだけです。

高次言語では、関数は単なる別の種類の値であるという考え方です。Cで識別子なしで(3 + 4)を使用できるのと同じように、スキームで識別子なしで(lambda(x)+(3 x)))を使用できます。

ここで重要なのは、無名関数について特別なことは何もないということではありません。関数を他の値とは異なる方法で処理する必要があるのは、他の言語の制限のみです。特別な定義は、それを許可しない手続き型言語用であり、関数型言語用ではありません。


11

ラムダ計算では、すべての関数(項)は匿名です。これはラムダ計算の本質的な特性です。複雑な関数に名前を付けなくても、単純な関数から作成できます。

プログラミング言語では、関数に名前を付けることが望ましい場合があります。これは、私たちの考え方であり、コードを人間が読みやすくするためです。ただし、コンパイルにより、実行可能ファイルを生成するときに名前が削除されます(デバッグ情報を無視する場合)。

言語が無名関数(つまり、名前のない関数)を表現できる場合、それはプログラマーとコンパイラーの両方に利点をもたらす可能性があります。プログラマーは多くの場合、短いコードを記述でき、コンパイラーはより適切に最適化できます。他の場所ではなく、場所。


1

質問のどの部分を強調するかによって異なります。それが具体的には無名関数に対して匿名であることの特性である場合、実際の唯一の答えは、それらが非結合値であるということです。一般的に関数について話している場合、匿名関数はおそらく、アプリケーション言語での関数設定でのラムダ計算の使用の最も目に見える兆候です

実際、ラムダ計算の観点から見ると、ラムダ式はバインディングの作成に使用される非常に構文上の構成要素です。ラムダ計算で使用されている表記を思い出してください。

λf.λx.fx

ここで、とは内部式内でバインドされています。そこでの各ラムダ式はバインディングを定義するため、名前バインディングのローカルコンテキストとして機能します。x f xfxfx

言語は通常、let(MLのような言語、スキーム)、またはdefine(スキーム)などのトップレベルで使用可能なバインディングを作成する方法を提供します(または、モジュールやオブジェクトなどの関数よりも複雑な構文構造内で)しかし、 bindingsは、下位レベルのラムダです。

スキームやlisp方言などの言語を見ると、それらの非常に大きな資金源はラムダ計算であり、多くの特殊な形式は本当に糖衣ラムダです。

以下のために連鎖性言語、話は少し異なります。ラムダは必要なく、実際には逆効果です。すべてが関数である場合、匿名のラムダを定義する意味は何ですか?

どういうわけか、これらの2種類の言語の間には二重性があります。後者はポイントフリー関数の組み合わせに焦点を当てているため、すべてを関数として表現しようとしますが、前者はより複雑な計算に取り組み、言語の他の値と同様に、関数をファーストクラスの値として持つように努力します。この点で、その努力の結果としてラムダを見ることができます。

この回答で(不十分に)紹介されたトピックに関するいくつかのポインタ:

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.