ラムダ言語とは何ですか?


89

私は「JavaScript:良い部分」を読んでいて、作者はJavaScriptが最初にリリースされるラムダ言語であると述べています。

JavaScriptの関数は、(主に)字句スコープを持つファーストクラスオブジェクトです。JavaScriptは、主流になった最初のラムダ言語です。JavaScriptは、JavaよりもLispやSchemeと共通しています。Cの服を着たLispです。これにより、JavaScriptは非常に強力な言語になります。

ラムダ言語とは何なのかわかりませんでした。そのような言語の特性は何ですか?それはJava、C、C ++、Phpのような言語とどう違うのですか?


6
ラムダは匿名表現を意味します。ラムダ語->匿名表現を使用する言語
bevacqua

FYI Googleブックスのリンク、:books.google.co.uk/...
ルーカス・ジョーンズ

3
ウィキペディアのラムダ計算を参照してください。
2010年

多くの良い返信。私がこれまでに理解したことは、匿名関数を使用している場合、ラムダ言語に取り組んでいることです。それは、javaのような言語とラムダ言語がどのように異なるかを正しく理解していることです。
sushil bharwani

4
「 『JavaScript:良い部分』を読んでいて、作者はJavaScriptが最初にリリースされるラムダ言語であると述べています。」だから私はラムダ言語をググってSOでこの質問を見つけました:)
Bugs Bunny

回答:


38

「ラムダ言語」という言葉を誰かが使用するのを聞いたことがありません。私が考えることができるもっともらしい定義は、JavaScriptを「最初の」として除外することです。

そうは言っても、彼は次のいずれかを意味しているのではないかと思います。

  • 関数型言語:計算が(おそらく高次の)関数のステートレス構成としてモデル化されている(またはモデル化できる)言語のクラス。LISP、Scheme、ML、Haskellなどは、このクラスに属することが多いですが、これらのいくつかは、より適切に混合されたパラダイムまたは「関数型オプション」言語です。Javascriptは間違いなくプログラミングの「関数型」を可能にするために必要な機能を含んでいます。
  • 匿名関数の作成を可能にする言語(functionJavaScript の構文を使用。これはlambda多くの言語で記述されているため、「ラムダ言語」の可能性があります。

どちらの使用法も、ギリシャ文字のラムダを使用してラムダ計算での関数の抽象化を表すことから派生しています。ラムダ計算は、アロンゾチャーチによって考案された計算モデルであり、関数プログラミングの基礎となっています。

編集:Googleブックスの結果を見て、「最初に主流になった」; まあ、それは議論の余地があります。私は、LISPが少なくとも合理的に主流であった時期があったと思います。それは公平な点ですが、JavaScriptのセマンティクスはSchemeに直接影響を受けており、同様の主張を行うことができる他のどの言語よりも確かに多くの聴衆に到達しました。


Lucas JonesのGoogleブックリンクから投稿されたリンクを参照してください。リンクをクリックすると、私が話しているページに移動します。答えてくれてありがとう
sushil bharwani

5
JavaScriptが「最初」であると説明されている理由は、ステートメントが「to go mainstream」で修飾されているためです。JavaScriptが、毎日のプログラマーが毎日の仕事で使用する最初の関数型言語であることは明らかです。
rfunduk

1
「関数型」のプログラミング言語とはどういう意味ですか。私はJavaの出身ですが、JavaScriptをどのように違うのかを学ぼうとしています。
sushil bharwani

9
それは探求する大きなトピックです。去年、私はあなたが今いる場所でした:私はクロックフォードのエッセイと講義を見つけて、閉鎖を理解したかったです。ジョン・ヒューズ「関数型プログラミングが重要な理由」:私はその後、いくつかのエッセイに移動、あなたがウィキペディアで始まる推薦するscribd.com/doc/26902/whyfp、スラバAkhmechet「私たちの残りのための関数型プログラミング」defmacro.org/ramblingsを/fp.html心を広げるための本がたくさんあります。LittleSchemerをチェックして、Schemeの感触をつかんでから、コンピュータプログラムの構造と解釈に進んでください。
michiakig

5
@sushil:このトピックに関する入門文献はたくさんあります。ただし、一般的な用語としては、プログラムを逐次的な命令や抽象的なオブジェクト間の相互作用ではなく、数学的なオブジェクトとして扱うことを強調するプログラミングスタイルです。たとえば、関数型言語は反復よりも再帰を優先し、不変のデータ構造を利用し、「関数オブジェクト」や「戦略パターン」よりも高次関数を使用します。高次関数とは、(引数として)操作したり、他の関数を(戻り値として)生成したりする関数を意味します。
デリックターク

48

ラムダ言語は、簡単に言えば、関数を別の関数に渡すことができる言語であり、関数は他の変数として扱われます。また、匿名で(またはインラインで)渡されるようにこの関数を定義できる必要があります。PHP 5.3はラムダ関数のサポートを追加しました。JavaScriptは最初の主流言語でしたか?Lispは、JavaScriptの前の教育環境や、愛するEmacs http://www.gnu.org/software/emacs/manual/html_node/eintr/のカスタマイズにも広く使用されています。

ここに例があります

function applyOperation(a, b, operation) {
  return operation(a,b);
}

function add(a,b) { return a+ b; }
function subtract(a,b) {return a - b;}

// Can be called like
applyOperation(1,2, add);
applyOperation(4,5, subtract);
// Anonymous inline function
applyOperation(4,7, function(a,b) {return a * b})

Cとどう違うのですか?Cでは、ポインターを関数に渡すことができますが、インラインで匿名で定義することはできません。

Java(バージョン8より前)では、同じ効果を得るには、実際には匿名でインラインで定義できるインターフェースを実装するオブジェクトを渡す必要があります。


1
「Lispは広く使われている」とは誰ですか?教授はいつもそれについて話し合うので、私は常にそれについて知っていましたが、実際には、Lispを使用した人に会ったことはありません。Javascriptを使用したことがある人をだれでも見つけることができるため、Javascriptがはるかに「主流」になります。
palswim

「PHP 5はラムダ関数のサポートを追加しました」。実際には、ラムダ関数を導入したPHP 5.3でした。
Crozin

ビジネスで使用した人はほとんどいませんが、Pascalがそうだったように、教育現場で広く使用されています。
ファンメンデス

4

彼はラムダ計算について言及しています。

ラムダ計算は、λ計算とも呼ばれ、関数の定義、適用、再帰のための正式なシステムです。[...]

[...]型なしラムダ計算は関数型プログラミング、特にLispの最初のインスピレーションであり、型付きラムダ計算は現代の型システムの基礎として機能します。


4

匿名関数として、および関数への参照として定義されたラムダを見てきました。JavaScriptは両方をサポートします:

setTimeout(function(){ /* an anonymous function */ }, 100)

var f = function(){ /* function ref */ }

これは、JSが多くの力と柔軟性を得るところです。Javaはある程度前者(匿名インターフェースの実装)をサポートしていますが、後者はサポートしていません。Java8の更新については、以下を参照してください。

これらのうちのどちらか(または両方)がラムダの適切な定義であるかは、私にはわかりません。

JSは、これらの機能をサポートする最初の言語ではありません。記憶から言えば、言語愛好家は常にラムダをサポートすることを絶賛しているという小さな話だと思います。

ところで、Javaでは、匿名クラスは通常、引数にその場でクラス定義を渡すために使用されます(swingでよく使用されます)。このようなもの(メモリから、コンパイルされていない):

someGuiContainer(new WidgetInterface()
      {
           public void importantMethodToDefine(){
             // Handle having the method called in my special widget way
           }
        }
)

更新

Javaは、8の時点で正式にLambda言語になりました。

次の構文を使用できます。

MathOperation addition = (int a, int b) -> a + b;
System.out.println("10 + 5 = " + tester.operate(10, 5, addition));

コードソース


1

コンピュータプログラムの構造と解釈と呼ばれるMITのオープンコースウェアでは、Hal Abelson、Jerry Sussman、Julie Sussmanによる本です。彼らはLISPの方言であるSchemeについて議論し、そこでラムダとは何か、Scheme LISPと一般的な言語についての非常に詳細で明確な説明を説明します。コンピュータプログラミングを本当に明確かつ深く理解したい場合は、このドキュメントをご覧になることを強くお勧めします。あなたに説明するには、そこに行って本を読んだり、完全に説明しているチュートリアルを読んだりする場合の3倍の時間がかかります。それは天才です。

Javascriptは主に言語SchemeとLispの父に基づいており、さらにラムダ構造を採用して主流になりました。


0

ウィキペディアから:LispやPythonなどのプログラミング言語では、ラムダはラムダ計算の使用法に従って、無名関数またはクロージャーを示すために使用される演算子です。Python言語でのラムダのこの使用例は、各エントリの最後の文字でアルファベット順にリストをソートするコンピューターコードのこのセクションです。

>>> list = ['woman', 'man', 'horse', 'boat', 'plane', 'dog']
>>> sorted(list, key=lambda word: word[-1])
['horse', 'plane', 'dog', 'woman', 'man', 'boat']

* In the C# programming language a lambda expression is an anonymous function that can contain expressions and statements

0
  • JavaScriptでは、識別子にバインドされていない関数である匿名関数を定義できます。このような関数はLambda Abstractionとも呼ばれ、JSがこれをサポートしているため、Lambda言語と呼ばれます。

  • プロパティ:この関数は、関数をすぐに実行する場合、または関数に名前を付けることの重要性がない短期的な使用の場合に必要です。

  • JSのように、Java、C、C ++、PHPなどの言語とは異なり、匿名関数がクロージャーとカリー化に使用されます。

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