web-dev-qa-db-ja.com

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

私は「JavaScript:The Good Parts」を読んでいて、著者はJavaScriptがローンチされる最初のラムダ言語であると述べています。

JavaScriptの関数は、(ほとんど)字句スコープを持つファーストクラスのオブジェクトです。 JavaScriptは、主流になる最初のlambda言語です。深く、JavaScriptはJavaよりもLISPとSchemeにより多くの共通点があります。 Cの服を着たLISPです。これにより、JavaScriptは非常に強力な言語になります。

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

86
sushil bharwani

誰もが「ラムダ言語」という用語を使用することを聞いたことがなく、私が考えることができる唯一のもっともらしい定義は、「最初の」としてJavaScriptを除外するでしょう。

とはいえ、彼は次のいずれかを意味していると思われます。

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

両方の使用法は、ギリシャ文字lambdaを使用して派生したもので、ラムダ計算における関数の抽象化を示しています。これは、Alonzo Churchによって考案され、関数型プログラミングの基礎となっている計算モデルです。

編集:Googleブックスの結果を見て---「最初に主流になる」;まあ、それは議論の余地があります。私は、LISPが少なくとも合理的に主流であったことを提唱しました。ただし、JavaScriptのセマンティクスはSchemeから直接インスピレーションを得ており、同様の主張をすることができる他のどの言語よりも確かに多くの聴衆に届きました。

36
Derrick Turk

ラムダ言語は、簡単に言えば、関数を別の関数に渡すことができる言語であり、その関数は他の変数として扱われます。また、この関数を匿名で(またはインラインで)渡すように定義できる必要があります。 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より前)では、同じ効果を実現するには、実際に匿名でインラインで定義できるインターフェイスを実装するオブジェクトを渡す必要があります。

47
Juan Mendes

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

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

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

これは、JSがその力と柔軟性の多くを得るところです。 Javaはある程度まで(匿名インターフェースの実装)をサポートします。 しかし、後者ではありません -Java 8。

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

JSは、これらの機能をサポートする最初の言語ではありません。メモリから行くと、言語愛好家がラムダをサポートすることを常に絶賛しているそのSmalltalkだと思います。

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

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));

コードソース

4
mtyson

彼は ラムダ計算 を参照しています。

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

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

4
BenoitParis

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

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

1
Max

ウィキペディアから: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
r3nrut
  • JavaScriptでは、識別子にバインドされていない関数である匿名関数を定義できます。このような関数はLambda抽象化とも呼ばれ、JSがこれをサポートするため、Lambda Languageとして知られています。

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

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

0
MERLIN THOMAS