私はスキームに非常に慣れていません。誰にとっても非常に基本的な質問です。オンラインでどこでも見られる関数呼び出しのラムダとは何ですか? それは何をするためのものか?使わないと何を失うの?
2 に答える
ラムダは関数リテラルです。類推が役立つ場合があります。
数字の 10 を表示したいとしましょう。これには 2 つの方法があります。まず、それを変数に入れてから、次のように変数を表示できます。
(define x 10)
(display x)
または、数値を直接表示することもできます (数値リテラル)。次のようにします。
(display 10)
ラムダも同じです。たとえば、2 つの数値を加算する関数を適用した結果を表示したい場合、その関数を変数に入れて、次のように結果を表示できます。
(define f (lambda (x y) (+ x y)))
(display (f 10 20))
または、次のように関数リテラル (ラムダ) を使用することもできます。
(display ((lambda (x y) (+ x y)) 10 20))
余談ですが、Scheme は、ラムダの本質を隠すことができる関数定義の省略形を提供します。f を次のように定義することもできます。
(define (f x y) (+ x y))
しかし、私は対応を明確にしたかった。
ラムダは、数値リテラルが有用であるのと同じ理由で有用です。Scheme では、引数として他の関数を取る関数を持つことができます。場合によっては、「1 回限り」の機能を備えたものの 1 つを使用したいので、わざわざ名前を付けたくない場合があります。たとえば、関数をリストに適用する map を見てみましょう。
(map f my-list)
結果が各要素に適用される新しいリストを作成します。では、リストの各要素をインクリメントしたい場合はどうすればよいでしょうか? 私はそれをできた:
(define inc (lambda (x) (+ x 1)))
(display (map inc '(1 2 3)))
しかし、この inc が 1 回限りのものであると仮定すると、わざわざ名前を定義したくないので、次のようにすることができます。
(display (map (lambda (x) (+ x 1)) '(1 2 3)))
ラムダが役立つもう 1 つの場所は、制御構造のようなものを作成したいが、マクロを使用したくない場合です。まあ、ラムダでやりたいことをラップできますし、それが入っているコンテキストを継承するので、完全にうまく機能します。たとえば、「for-each」の独自のバージョンを作成する必要があるとします。概要は次のとおりです。
(define for-each (lambda (collection body)
...))
body は、「制御構造」の本体を表すラムダです。
次に、次のように使用します。
(for-each collection (lambda (element)
...))
ラムダを使用して、他の引数を持つ関数を動的に構築することもできます。これが大きな効果を発揮するのは、手動でカリー化を行いたい場合です。すでに行き過ぎている可能性があるため、詳細には触れませんが、複雑さをあまり導入することなく、ラムダが多くの機能を提供することを理解していただければ幸いです。これは、それを使用しないことで失うものについてのあなたの質問にも答えるはずです.
関数リテラル (匿名関数とも呼ばれます) は、関数型プログラミングでは重要であり、命令型言語でも成長しています。この機能をマスターすると、生活がずっと楽になり、他の言語の学習にも役立ちます。
lambda
は、Lisp プログラミング言語のファミリー (および関数型プログラミングをある程度サポートしている他の言語) の特別な形式であり、それが定義されたコンテキストの周りにクロージャーを作成する無名関数です。
ラムダは、明示的または暗黙的に (マクロ変換の背後で、他の特別な形式で暗黙的になど) Lisp のあらゆる場所で使用されます。これを使用しないことで何を失うでしょうか? すべて。手始めに、手順を定義する機能!
私が言いたいことのいくつかの例を見るために、このプロシージャ定義:
(define (f x)
x)
...これは単なる構文糖衣であり、名前を単に匿名に関連付ける名前付きプロシージャですlambda
。
(define f
(lambda (x)
x))
同様に、let
値を変数にバインドするフォーム:
(let ((x 9))
(+ x 1))
...これは単なる構文糖衣です:
((lambda (x)
(+ x 1))
9)
もちろん、無名関数を定義する簡単な方法としてラムダを使用できます。
(map (lambda (x) (* x x))
'(1 2 3 4 5))
正直なところ、Lisp で自明でないプログラムを作成するためにラムダを使用しないことはほとんど不可能です。