現代の主流のプログラミング言語でラムダ関数の人気が高まったきっかけは何ですか?


112

過去数年で、匿名関数(ラムダ関数)は非常に人気のある言語構成要素になり、ほぼすべての主要な/主流のプログラミング言語がそれらを導入するか、標準の次の改訂で導入する予定です。

しかし、匿名関数は、数学とコンピューターサイエンス(1936年頃に数学者のアロンゾ教会によって発明され、1958年からLispプログラミング言語で使用された、たとえばここを参照)で非常に古く、非常によく知られた概念です。

では、なぜ今日の主流のプログラミング言語(その多くは15年から20年前に生まれたもの)が、最初からラムダ関数をサポートし、後で導入しただけだったのでしょうか?

そして、ここ数年で匿名機能が大々的に採用されたきっかけは何ですか?この現象を引き起こした特定のイベント、新しい要件、またはプログラミング手法はありますか?

重要な注意点

この質問の焦点は、現代のメインストリーム(したがって、いくつかの例外を除いて、機能しない)言語での匿名関数の導入です。また、匿名関数(ブロック)は関数型言語ではないSmalltalkに存在し、通常の名前付き関数はCやPascalなどの手続き型言語にも長い間存在していることに注意してください。

「機能的なパラダイムの採用とその利点」について話すことによって、あなたの答えを一般化しすぎないでください。これは問題のトピックではないからです。


7
15〜20年前、人々はオブジェクト指向について同じ質問をしていました...それは新しい概念ではありませんでしたが、人気が爆発的に高まりました。
MattDavey

7
@MattDaveyほとんどの人は確かに意見が異なりますが、「ほとんどのSmalltalk開発者」はそれほど多くの人ではないことを思い出さなければなりません
。P– yannis

30
より興味深い質問は、彼らの triggeredを引き起こしたものだと思います!結局のところ、現代のほとんどの言語にラムダが含まれていた時代があり、JavaやC ++などの言語が普及しました。(私は正確に「現代」言語のJavaを呼び出すことはありませんが。Javaで最も近代的な概念は、60年代後半/ 70年代初頭にさかのぼるジェネリック医薬品です。でも、組み合わせのJavaが提供する機能、ポインタの安全性、メモリ安全性、種類の安全性、GC、静的に型付けされたオブジェクト指向、ジェネリックはすべて1985年にエッフェルに存在しました…そしてもっと良いことに、IMHO。)
ヨルグWミットタグ

31
Java 1.0が登場する前でさえ、まだ設計の初期段階でしたが、Javaにはラムダが必要であるとほとんどの人が指摘していました。Javaに携わったデザイナーの中には、Guy Steele(Lisp支持者、Schemeの共同デザイナー、Common Lispの共著者、Fortressのデザイナー)、James Gosling(PC用の最初のEmacs Lispインタープリターを書いた)、Gilad Bracha(Smalltalk提案者、Animorphic Smalltalkの共同デザイナー、Newspeakのデザイナー)、Phil Wadler(Haskellの共同デザイナー)、Martin Odersky(Scalaのデザイナー)。Javaがラムダなしでどのように終わったかは、本当に私を超えています。
ヨルグWミットタグ

8
「小さなビット」とは、多くの場合、50%の機能、50%のノイズを意味します。
ケビンクライン

回答:


86

確かに、関数型プログラミング、または少なくともその特定の側面への顕著な傾向があります。いくつかの点で無名関数を採用した一般的な言語の中には、C ++(あるC ++ 11)、PHP(PHP 5.3.0)、C#(C#のV2.0)、デルファイ(2009年以降)、Objective Cの(ブロック)中のJava 8は、言語にラムダのサポートをもたらします。また、一般的に機能的とは見なされないが、最初から、または少なくとも早い段階で、匿名機能をサポートしている人気のある言語があります。

すべてのトレンドと同様に、それらを引き起こした単一のイベントを探すことはおそらく時間の浪費であり、通常は要因の組み合わせであり、そのほとんどは定量化できません。実用的なCommon Lispの 2005年に発表されたが、としてのLispに新たな注目をもたらすのに重要な役割果たしている可能性が現実的なかなりの時間のためにLispがあったように、言語のほとんどは、あなたがアカデミックな設定で会いたい言語、または非常に特定のニッチ市場。munificentはで説明しているようにはJavaScriptの人気はまた、無名関数に新たな注目をもたらすことに重要な役割を果たしている可能性が彼の答え

多目的言語からの機能概念の採用以外に、機能的(またはほとんど機能的)言語への顕著な変化もあります。Erlang(1986)、Haskell(1990)、OCaml(1996)、Scala(2003)、F#(2005)、Clojure(2007)などの言語、さらにR(1993)などのドメイン固有の言語も強力なフォローを獲得しているようですそれらが導入された後。一般的な傾向は、Scheme(1975)や明らかにCommon Lispのような古い関数型言語に新たな注目を集めました。

もっと重要なイベントは、業界での関数型プログラミングの採用だと思います。それはケースのように使用しなかった理由を私は絶対にないアイデアを持っていないが、それは関数型プログラミングは、それが、業界で場所だと(多分)の開始を見つけるために始めた初期および90年代半ばの間にいくつかの点で私のことに思えるでアーランの増殖電気通信および航空宇宙およびハードウェア設計におけるHaskellの採用

Joel Spolskyは非常に興味深いブログ記事The Perils of JavaSchoolsを執筆しました。そこでは、言語の習得がより難しいと思われるJavaを他の言語よりも好むという(当時の)大学の傾向に反論しています。ブログの投稿は関数型プログラミングとはほとんど関係ありませんが、重要な問題を特定しています。

そこには議論があります。私のような怠け者のCS学部生による長年の泣き言は、アメリカの大学を卒業するCS専攻の数が少ないという業界からの苦情と相まって、犠牲になりました。履歴書を評価するために "grep"を使用する採用担当者はそれが気に入っているようです。何よりも、Javaについては、ポインターや再帰を行う脳の部分なしにプログラマーを実際に排除するほど難しいものはありません。退学率は低く、コンピューターサイエンス部門の学生数も多く、予算も増えています。すべて順調です。

私が大学時代に最初に彼女に会ったとき、私はどれだけLispを嫌っていたかを今でも覚えています。それは間違いなく厳しい愛人であり、すぐに生産的になることができる言語ではありません(少なくとも、私はできませんでした)。Lispと比較して、Haskell(たとえば)は非常に友好的であり、それほど労力を費やすことなく、完全な馬鹿のように感じることなく生産性を高めることができます。

全体として、これは良いことです。いくつかの多目的言語は、以前はほとんどのユーザーにとって難解であると思われていたパラダイムの概念を採用しており、主なパラダイム間のギャップは狭くなっています。

関連する質問:

参考文献:


答えてくれてありがとう(そしてたくさんの興味深いアイデア)。+1ただし、プログラミング言語に(のみ)ラムダを導入することはFPへの非常に小さなステップであり、多くの人にとって混乱することさえあると主張します(ラムダが命令型言語内で単独で何をしているのでしょうか?)Haskell、Scala、およびSMLをいくつか学習した後、ラムダのみをサポートする命令型言語(カリー化、パターンマッチング、不変性について)で実際のFPを実行できるという感覚がありません。
ジョルジオ


2
@YannisRizos:Perlには5(1994)の最初のリリース以来匿名関数がありましたが、5.004(1997)まで完全に「正しく」ではありませんでした。
Blrfl

1
@penarturそれも私が考えたものですが、フレンドリーなエディターが私をここに指して修正しました:msdn.microsoft.com/en-us/library/0yw3tz5k%28v=vs.80%29.aspx
yannis

関数型言語の人気をもたらした主な「イベント」はおそらくウェブだと思います。具体的には、デスクトッププログラムからサーバー側への移行。これにより、開発者はプログラミング言語を自由に選択できます。90年代のPaul GrahamとLispは注目すべき例です。
ギラッドナオール

32

私は、関数型プログラミングの人気がJavascriptの成長と普及にどれだけ匹敵しているかが興味深いと思います。Javascriptには、関数型プログラミングのスペクトルに沿って、主流のプログラミング言語(C ++ / Java)の作成時(1995年)にはあまり人気がなかった多くの急進的な機能があります。唯一のクライアントサイドWebプログラミング言語として、突然メインストリームに注入されました。突然、多くのプログラマーが単純にJavascriptを知らなければならなかったため、関数型プログラミング言語の機能について知っておく必要がありました。

Javascriptの突然の登場がなかったら、一般的な関数型言語/機能はどのようになるのだろうか。


5
Javascriptは確かに重要な言語ですが、Javascriptの導入が関数型プログラミングの人気を説明できるかどうかはわかりません。他の多くの関数型プログラミング言語がこの数年で登場しました。 。
ジョルジオ

8
@Giorgio-他にも多くの関数型プログラミング言語があったかもしれませんが、(比較的)誰もそれらを使用していません。JSの使用と、ファンクターを作成するC ++ / Javaの方法は苦痛で迷惑であるという見方が強まっています。
テラスティン

1
一般的な動的言語の人気は、Haskellの人気の説明の1つとして示唆されています。book.realworldhaskell.org
read

また、質問の焦点はFPの一般的な人気ではなく、汎用の非関数型言語での匿名関数の最近の導入についてです。たとえ大衆(ほとんどのプログラマー)がそれらを知らなかったとしても、言語設計者はそれらを非常によく知っていました。最初にそれらを除外する理由があったに違いありません。90年代初期の開発者にとっては、直感的ではないと考えられたのかもしれません。
ジョルジオ

@giorgio-Javaスタイルのファンクターとは対照的に、実装がはるかに面倒です。それを知識/採用の欠如と組み合わせてください、そしてそれはかなり明確な設計選択です。
テラスティン

27

JavaScriptとDOMイベントハンドラは、プログラマの何百万人がいることを意味していた行うためには、少なくとも第一級関数について少し学ぶために任意のウェブ上での対話を。

そこから、匿名関数への比較的短いステップです。JavaScriptは終了しないthisため、クロージャについても学ぶことを強くお勧めします。そして、あなたは黄金色です。あなたは、囲んでいるレキシカルスコープを閉じる匿名のファーストクラス関数を理解しています。

使い慣れたら、使用するすべての言語で使いたいです。


7
+1匿名関数だけではありません。クロージャーは、単に一時的な関数をインラインで定義するよりもはるかに広い概念です。
phkahler

@phkahler:あなたは正しいです、そしてこの意味で、Javaにはすでにクロージャーがあります(そして関数リテラルで得られるものよりも強力です)が、1メソッドの匿名クラスの一般的なケースのための簡潔な表記法に欠けています。
ジョルジオ

17

確かにそれだけが要因ではありませんが、Rubyの人気を指摘します。これは、ボード上の6つの回答のどれよりも重要ではありませんが、一度に多くのことが起こったので、それらすべてを列挙することは有益だと思います。

Rubyは関数型言語ではなく、MLのようなものを使用するとラムダ、prod、およびブロックは不格好に見えますが、事実、それはマッピングの概念を普及させ、JavaおよびPHPを逃げるためにJavaとPHPから逃げる世代の世代に還元します牧草地。いくつかの言語のラムダは、他の何よりも防御的な動きのようです(「スティック!

しかし、ブロック構文と.each、.map、.reduceなどと統合された方法は、たとえコルーチンのように振る舞う構文構造であるとしても、匿名関数の概念を普及させました。そして、&を介したprocへの簡単な変換により、関数型プログラミングのゲートウェイドラッグになります。

JavaScriptを作成するRuby on Railsプログラマーは、軽量で機能的なスタイルで物事を行うことにすでに取り組んでいると主張します。それとプログラマーのブログ、Reddit、ハッカーNews、Stack Overflowの発明がほぼ同時期に行われ、ニュースグループの時代よりもインターネット上でアイデアが急速に広まりました。

TL; DR:Ruby、Rails、JavaScript、ブログ、およびReddit / Hacker News / Stack Overflowは機能的なアイデアを大衆市場に押し出したので、誰もがそれ以上の離反を防ぐために既存の言語でそれを望んでいました。


2
+1良い答えと(できれば、賛成票が1つしかないので)+1「いくつかの言語のラムダは、他の何よりも守備的な動きのようです」 !!)」。これも要因だと思います。一部の言語では、ラムダは言語全体に非常に小さな表現力を追加しますが、言語にある程度の人気を与えています。多くのプログラマーは、匿名関数のサポートは完全に関数型プログラミングをサポートすることと同等だと考えているようです)
ジョルジオ

2
これが、近年ほとんどの言語がブロック構文を実装している理由だと私は本当に思っています。しかし、確認する唯一の方法は、彼の言語開発者に彼らの動機を尋ねることです。しか推測できません。
スポボ

私にとって、Rubyは最初にブロックをロックして非常に魅力的な言語にしたので、+ 1です。Haskellにも効果があったかもしれません。
-rogerdpack

13

以下のようヤニスは指摘し、せずに以前いた言語で、高次機能の採用に影響を与えたいくつかの要因があります。彼が軽く触れた重要な項目の1つは、マルチコアプロセッサの急増であり、それにより、より並列および同時処理が望まれています。

関数型プログラミングのmap / filter / reduceスタイルは、並列化に非常に適しているため、プログラマは明示的なスレッドコードを記述することなく、複数のコアを簡単に利用できます。

Giorgioが指摘しているように、関数型プログラミングには単なる高階関数以上のものがあります。関数、さらにmap / filter / reduceプログラミングパターン、および不変性は、関数型プログラミングの中核です。これらを組み合わせることで、並列および並行プログラミングの強力なツールが作成されます。ありがたいことに、多くの言語はすでに不変性の概念をサポートしており、プログラマーはそれを不変として扱い、ライブラリーとコンパイラーが非同期または並列操作を作成および管理できるようにします。

高次関数を言語に追加することは、並行プログラミングを簡素化するための重要なステップです。

更新

Lokiが指摘した懸念に対処するために、さらに詳細な例をいくつか追加します。

ウィジェットのコレクションを走査して、ウィジェットの価格の新しいリストを作成する次のC#コードを検討してください。

List<float> widgetPrices;
    float salesTax = RetrieveLocalSalesTax();
foreach( Widget w in widgets ) {
    widgetPrices.Add( CalculateWidgetPrice( w, salesTax ) );
}

ウィジェットの大規模なコレクション、または計算集約的なCalculateWidgetPrice(Widget)メソッドの場合、このループは利用可能なコアをうまく​​利用しません。異なるコアで価格計算を行うには、プログラマーがスレッドを明示的に作成および管理し、回避策を渡し、結果を一緒に収集する必要があります。

高次関数がC#に追加された後の解決策を検討してください。

var widgetPrices = widgets.Select( w=> CalculateWidgetPrice( w, salesTax ) );

foreachループはSelectメソッドに移動され、実装の詳細が非表示になりました。プログラマーに残るのは、Selectに各要素に適用する機能を選択することだけです。これにより、Select実装は、Parellelで計算を実行し、プログラマーの関与なしにすべての同期およびスレッド管理の問題を処理できます。

しかし、もちろん、Selectは並行して動作しません。そこで不変性が生じます。Selectの実装は、提供された関数(上記のCalculateWidgets)に副作用がないことを知りません。この関数は、Selectのビューとその同期の外側でプログラムの状態を変更し、すべてを壊す可能性があります。たとえば、この場合、salesTaxの値は誤って変更される可能性があります。純粋な関数型言語は不変性を提供するため、Select(マップ)関数は状態が変化していないことを確実に知ることができます。

C#は、Linqの代替としてPLINQを提供することでこれに対処します。次のようになります。

var widgetPrices = widgets.AsParallel().Select(w => CalculateWidgetPrice( w, salesTax) );

これらのコアを明示的に管理することなく、システムのすべてのコアを最大限に活用します。


4番目の段落でリンクしている「A Erlangの歴史」ACMの記事で説明されているように、並列処理と並列処理をさらに増やしたいという要望を指摘しています。しかし、それは非常に良い点であり、おそらくもう少し拡張すべきでした。+1が必要になったので、P
yannis

あなたは正しい、私は十分に注意深く見ていない。発言を編集しました。
ベン

ああ、あなたは本当にそれをする必要はありませんでした、私は不平を言っていませんでした;)
ヤンニス

4
上記で説明したものはどれもラムダを必要としません。同じ機能は、名前付き関数を使用しても簡単に実現できます。ここではcauseperceived affectを説明せずに単にを文書化していcorrelationます。最後の行IMOは、質問の内容です。しかし、あなたはそれに答えませんでした。なぜ並行プログラミングが簡素化されるのですか。
マーティンヨーク

@Ben:あなたの例は、匿名関数を使用する必要のない高階関数に関することに注意してください。あなたの答えには興味深いアイデアが含まれていますが(別の質問のために)、今話題から外れています。
ジョルジオ

9

ここでの回答の多くに同意しますが、興味深いのは、ラムダについて学び、それらに飛びついたとき、他の人が言及した理由のいずれでもなかったことです。

多くの場合、ラムダ関数はコードの可読性を向上させるだけです。ラムダの前に、関数ポインター(または関数、またはデリゲート)を受け入れるメソッドを呼び出す場合、その関数の本体をどこか別の場所で定義する必要があったため、「foreach」構文がある場合、読者は別の場所にジャンプする必要がありますコードの一部を使用して、各要素で正確に何を計画していたかを確認します。

要素を処理する関数の本文が数行しかない場合、コードを読んでいるとき、機能は変更されませんが、リーダーは前後にジャンプする必要がないため、実装全体は匿名関数を使用します彼の目の前で

関数型プログラミング手法と並列化の多くは、匿名関数なしで実現できます。定期的に宣言し、必要なときにいつでも参照を渡します。しかし、ラムダを使用すると、コードの記述が容易になり、コードの読み取りが容易になります。


1
非常に良い説明(+1)。Lispプログラマーは、1958年以来このすべてを認識しています。;
ジョルジオ

4
@Giorgio:確かに、しかしLispプログラマーは、強化された開閉括弧キーを備えた特別なキーボードも購入しなければなり
DXM

@DXM:キーボードではなく、カッコを開閉するためのピアノペダルのような追加の入力デバイスを取得します
;

@ DXM、vartec:最近いくつかのSchemeをやっていますが、括弧は大丈夫です。一部のC ++コードはより暗号化されている場合があります(また、SchemeよりもC ++の方がはるかに多くの経験があります)。:
ジョルジオ

9

ここで最近の歴史に少し関与してきたので、1つの要因はJavaと.NETへのジェネリックの追加だったと思います。それは当然Func < >およびその他の強く型付けされた計算抽象化(Task < >、Async < >など)につながります

.NETの世界では、FPをサポートするためにこれらの機能を正確に追加しました。これにより、関数型プログラミング、特にC#3.0、LINQ、Rx、F#に関連する一連のカスケード言語作業がトリガーされました。その進展は他のエコシステムにも影響を与え、今日でもC#、F#、TypeScriptで続いています。

もちろん、HaskellがMSRでも動作するようにすると便利です:)

もちろん他にも多くの影響があり(JS)、これらの手順は他の多くの影響を受けましたが、これらの言語にジェネリックを追加することで、ソフトウェアの世界の大部分で90年代後半の厳格なオブジェクト指向の正統性を破り、オープンになりましたFPのドア。

ドン・シム

ps F#は2005年ではなく2003年でした-2005年まで1.0に達しなかったと言えますが、2001-02年にはHaskell.NETプロトタイプも作成しました。


ようこそ!2005年をF#に使用しました。これは、F#のウィキペディアの記事で最初の安定版リリースの年として報告された年です。2003年に変更しますか?
ヤニス

4

これは真面目な答えを意味するものではありませんが、この質問はジェームズ・アイリーによるクールでユーモラスな投稿を思い出させました- 次のフレーズを含むプログラミング言語の簡潔で不完全な、ほとんど間違った歴史

「ラムダは、Javaを持たないことで人気が出るまでラムダは比較的あいまいにされています。」


ゴールデンフレーズ:)
ピスタッシュ

4

私が見るほとんどの答えは、関数型プログラミングが一般的にカムバックし、主流になった理由を説明することに集中しています。しかし、これは特に匿名関数に関する質問と、なぜ匿名関数が突然人気を博したのかという質問には本当に答えていないと感じました。

本当に人気を得ているのはクロージャーです。ほとんどの場合、クロージャーは変数を渡されたスローアウェイ関数であるため、これらに匿名関数構文を使用することは明らかに理にかなっています。実際、一部の言語では、クロージャーを作成する唯一の方法です。

閉鎖が人気を博したのはなぜですか?コールバック関数を作成するときに、イベント駆動型プログラミングで役立つためです。現在、JavaScriptクライアントコードを記述する方法です(実際、GUIコードを記述する方法です)。現在、イベント駆動型のパラダイムで記述されたコードは通常、非同期で非ブロッキングであるため、非常に効率的なバックエンドコードとシステムコードを記述する方法でもあります。バックエンドでは、これはC10K問題の解決策として一般的になりました。


この質問は関数型プログラミングに関するものではないことを強調していただきありがとうございます(+1)(1)引数として渡されるコードブロックのアイデアは、Smalltalkなどの非関数型言語でも使用され、(2)状態を変化させるため(多くのラムダ実装で可能な限り)クロージャの字句コンテキストからキャプチャされたものは、間違いなく機能しません。そして、はい、閉鎖があるので、匿名の閉鎖へのステップは短いです。興味深いのは、クロージャーも長い間よく知られていることであり、80年代以来、イベント駆動型プログラミングが(私の知る限り)使用されてきたということです。
ジョルジオ

しかし、クロージャーが以前考えられていたよりもはるかに頻繁に使用できることが明らかになったのは、ここ数年だけだったかもしれません。
ジョルジオ

@Giorgio:はい、現在使用されている概念のほとんどは、非常に長い間存在しています。しかし、それらはその方法で使用されたわけではなく、現在使用されています。
バルテック

1

その理由は、オブジェクト指向プログラミング(オブジェクトで状態の変化をカプセル化する)のコアがもはや適用されない並行プログラミングと分散プログラミングの普及が進んでいるためだと思います。分散システムの場合、共有状態ないため(およびその概念のソフトウェア抽象化は漏れやすい)、同時システムの場合は、共有状態へのアクセスを適切に同期するのは面倒でエラーが発生しやすいことが判明しているためです。つまり、オブジェクト指向プログラミングの重要な利点の1つは、多くのプログラムには適用されなくなり、オブジェクト指向のパラダイムは以前ほど有用性が低くなりました。

対照的に、機能的パラダイムは可変状態を使用しません。したがって、機能的なパラダイムとパターンで得られた経験は、同時および分散計算にすぐに移行できます。そして、業界は車輪を再発明するのではなく、そのニーズに対応するためにこれらのパターンと言語機能を借りています。


4
一部のメインストリーム言語(C ++ 11など)の匿名関数は、可変状態を許可します(定義環境から変数をキャプチャし、実行中に変数を変更することもできます)。だから私は、一般的な機能的パラダイムについて、特に不変性について話すことは、尋ねられている質問の範囲から少し外れていると思います。
ジョルジオ

Java 8の機能に関する注意事項の一部を読んだだけで、プロジェクトラムダの主な目標の1つは同時実行性をサポートすることです。そして、それはすぐに、これらすべての素晴らしいjavabeanが実行される可変性クラスター爆弾に私たちを連れて行きます。Javaは(実際にそれを仮定して、バージョン8の最終リリースではありません)ラムダを取得したら、彼らはその後、不変ごとのデフォルトの問題に対処する必要が何とか副作用free関数- -それは一種のLispの中で考えて、言語を破壊する(代わりにof COBOL-DATA DIVISION / COPYBOOKで強打)
ロボプログ

よく言った。可変状態からの移行により、同時実行が容易になり、cascalogやsparkなどのテクノロジーがコンピューターのクラスター全体に機能プログラミングを簡単に分散します。方法と理由の詳細については、glennengstrand.info / analytics / distributed / functional / ...を参照してください。
グレン

1

私の0.02ユーロを追加する場合、概念を導入するJavaScriptの重要性に同意しますが、同時プログラミングよりも非同期プログラミングの現在のやり方を非難すると思います。(Webページに必要な)非同期呼び出しを行う場合、単純な匿名関数は非常に有用であるため、すべてのWebプログラマー(つまり、すべてのプログラマー)がこの概念に精通する必要がありました。


1

匿名関数/ラムダに似たものの別の本当に古い例は、Algol 60の名前による呼び出しです。ただし、名前による呼び出しは、真の関数を渡すよりもパラメーターとしてマクロを渡すことに近く、より壊れやすい/難しい結果として理解する。


0

ここで私の祖先は私の知る限りでは。

  • 2005:Javascriptは最近、ラムダを使用した高次プログラミングをメインストリームに戻しました。underscore.jsjqueryなどの特定のライブラリ。これらのライブラリの最初の1つは、jqueryを約1年前に作成したprototype.jsでした。プロトタイプは、RubyのEnumerableモジュールに基づいています。
  • 1996:RubyのEnumerableモジュールは、Smalltalkのコレクションフレームワークから非常に明らかにインスピレーションを得ました。多くのインタビューでマッツが言及したように、それは私たちを…に導きます
  • 1980年:Smalltalkは多くの高階プログラミングを使用し、高階プログラミングを多用するコレクションAPIを提供します(GNU SmalltalkのIterableクラスなど)。慣用的なSmalltalkコードでは、forループは検出されず、高次の列挙のみが検出されます。残念なことに、1998年にSmalltalkのコレクションフレームワークがJavaに移植されたときにJavaが高次の列挙を除外しました。これが、今後10年間で高次プログラミングが主流から段階的に廃止された方法です。Smalltalkには多くの祖先がありますが、OPの質問に関連するのはLISPです。
  • 1958:LISPのコアには、明らかに高次プログラミングがあります。

もちろん、AmissはMLの祖先全体です。ML、SML、OCaml、Haskell、F#。それは何かのためにカウントするようになった...
ムハンマドAlkarouri

-1

名前を付けるのは難しいので、匿名関数は便利です。関数を一度だけ使用する場合は、名前は必要ありません。

Lambda関数が最近主流になったのは、最近までほとんどの言語がクロージャをサポートしていなかったためです。

Javascriptがこの主流を押し進めたことをお勧めします。これは、並列処理を表現する方法のない汎用言語であり、匿名関数はコールバックモデルの使用を容易にします。さらに、RubyやHaskellのような一般的な言語も貢献しています。


1
「最近までほとんどの言語はクロージャーをサポートしていなかったため、ラムダ関数は最近になって主流になりました。」:この推論は私には少し循環的に聞こえます。すぐに「現代のプログラミング言語でクロージャーの人気を引き起こした理由」を尋ねることができます。
ジョルジオ

Pythonにはラムダの最適な実装がないことがわかっています。しかし、人気という点では、おそらくHaskellよりも貢献しました。
ムハンマドアルカウリ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.