web-dev-qa-db-ja.com

Javascriptは関数型プログラミング言語ですか?

関数がファーストクラスのオブジェクトであるという理由だけで、クロージャーと高階関数がありますが、Javascriptは関数型プログラミング言語と呼ばれるに値しますか?私が欠けていると思う主なものはPure Functionsであり、LISPのような他の関数型言語のように「感じる」ことはありません(ただし、それは実際に関数型言語ではないという正当な理由ではありません...)

130
hvgotcodes

同様の質問に対して 自分の答え を繰り返し、

関数型プログラミング言語の定義は受け入れられていません。

関数型言語を、ファーストクラス関数とラムダをサポートする言語として定義する場合、はい、JavaScriptは関数型言語です。

不変性のサポート、代数的データ型、パターンマッチング、部分的なアプリケーションなどの要素も考慮すると、JavaScriptは関数型言語ではありません。


次の関連ブログ投稿(およびそれらの下のコメント)を読むことをお勧めします。

174
missingfaktor

私はそれがマルチパラダイム言語であると言うでしょう。

編集:それはマルチパラダイムであり、機能的な構成が含まれています。

26
Niki Yoshiuchi

「関数型プログラミング」という用語を哲学的な議論のポイントにまで伸ばしてねじると、この問題が再び開かれる可能性があります。ただし、「C++は本当にプログラミング言語ですか」などの有用な質問のレベルになりますか?

より日常的なレベルでのあなたの質問に対する答えは"no"です。

関数型プログラミングとは、プログラムが制御フローではなく関数の評価として概念化されることを意味します。コードは機能の説明であり、制御フローの固有の概念はありません。

JavaScriptには制御フローがあり、命令型言語として概念化されています。その設計目標から、明らかに関数型言語ではありません。

15
shuhalo

「関数型プログラミング」言語という用語は、今日では非常に多くの負荷がかかっているため、ほとんど役に立たない。 2つの主要な意味があります。

  1. ファーストクラスの機能があります
    • Javascriptはこれです!
  2. ラムダ計算で使用される関数に基づいており、永続的な可変状態を回避することに重点を置いています(多くの場合、関数に渡されるパラメーターで置き換えます)
    • よく書かれているように、Javascriptはこれほど遠くありません!

意味を選んで、質問に答えてください。

8
Chuck

関数型プログラミングの具体的な定義はないと思いますが、人々が「関数型プログラミング」と考えることの多くはjavascriptで実現できると思います。これの良い簡単な例を示します article。

3
marknery

私にとって、Javascriptは命令型言語と関数型言語の両方であり、どちらの方法で使用するか、両方の方法で(egad)を選択することもできます。または、1つのパラダイムを使用し、他のパラダイムには手を触れないことを選択できます。それはあなた次第です。私は、あなたと同じように、Javascriptが関数型プログラミングパラダイムに出入りすることを可能にするため、Javascriptがcalled関数型言語であるべきだとは思わない。おそらく、機能的なプログラミングパラダイムのみを使用するように制限するために、何らかのプラグマがあれば、それは有用だと思います。しかし、要約すると、関数型プログラミング機能が組み込まれた命令型/手続き型言語のようなものです。

2
Brian Onn

プログラミング言語は特定のパラダイムを持っているとは思わないが、特定のパラダイムに適していると思う。ただし、特定のパラダイムに役立つからといって、そのパラダイムを使用する必要があるわけではありません。 Cでオブジェクト指向プログラムを作成し、MLで命令型プログラムを作成することは非常に可能です。言語はそのために設計されていないため、特定のパラダイムを使用して問題を解決しないのは、単に人為的に自分自身を制限するだけです(もちろん、特定のソリューションが適切なソリューションになるかどうかを決定するときは、言語の制限を考慮する必要があります)。

2
David Brown

まあ、それは関数型プログラミングだとは言いませんが、それからwouldオブジェクト指向だと言います。

ですから、そうは言いませんが、意見の余地があると思います。関数型プログラミングの古典的な特徴はありますが、他にはありません。

0
slezica

Javascriptでは、このようなことができます!!

// Data
var fruits = [
    { name: 'Apple',  price: 5 }, 
    { name: 'orange', price: 10 }, 
    { name: 'lemon',  price: 15 }
]

// Request Data from magicURL
request('magicURL')
    .then(selectKeyOf('price'))
    .then(priceMethod('sum'))
    .then((result)=>{
        console.log(result) // 30
    })

この概念をデモするために githubページ を作成しました。実装を複製/表示できます

0
Wayne Chiu

Javascriptは要点です。それは、あなたがそれをどのようにプログラミングするかにかかっています。 OOのようにコーディングすると、OOにならないでしょうか。ただ一つのことは完全に正確ではありません。

0
user372743

私たちが知っているように、関数型プログラミング言語は関数の要素(状態)を変更または変更することはできませんが、javascriptでは関数型プログラミング言語ではないという意味で許可されていますが、関数をファーストクラスの市民として扱います。

0
Sourabh Ranka

@petraszd「新しい」for演算子を取得するためにコードを少し書き直します。

   
   function ffor(a, b, f){
     function it(i){
       if(i > b)return
       f(i)
       it(i+1)
     }
     it(a)
   }

   print("----" + new Date()+"----")

   var funcs = []
   ffor(0, 9, function(i){
     funcs.Push(function(){return i})
   })

   ffor(0, 9, function(i){
     print(funcs[i]())
   })

しかし、この方法には大きなループの欠点があることを知っています...

JSでの末尾再帰の最適化に関する関連質問

追伸ここに投稿されているので、コメントとして投稿する際にコードのフォーマットに問題があります

0
aeracode