関数がファーストクラスのオブジェクトであり、クロージャーや高次の関数があるからといって、JavaScriptは関数型プログラミング言語と呼ばれるに値するのでしょうか?それが欠けていると私が思う主なものは純粋な関数であり、lispのような他の関数型言語のように「感じる」ことはありません(ただし、それが関数型言語にならない理由としては本当ではありません...)
関数がファーストクラスのオブジェクトであり、クロージャーや高次の関数があるからといって、JavaScriptは関数型プログラミング言語と呼ばれるに値するのでしょうか?それが欠けていると私が思う主なものは純粋な関数であり、lispのような他の関数型言語のように「感じる」ことはありません(ただし、それが関数型言語にならない理由としては本当ではありません...)
回答:
同様の質問に自分の答えを繰り返す、
関数型プログラミング言語の定義は受け入れられていません。
関数型言語をファーストクラスの関数とラムダをサポートする言語として定義した場合、そうです、JavaScriptは*関数型言語です。
不変性のサポート、代数的データタイプ、パターンマッチング、部分的なアプリケーションなどの要素も考慮する場合、JavaScriptは関数型言語ではありません。
以下の関連するブログ投稿(およびその下のコメントも)を読むことをお勧めします。
「関数型プログラミング」という用語を哲学的な議論のポイントにまで引き延ばすと、この問題は再び開かれるかもしれません。しかし、「C ++は本当にプログラミング言語なのか?」
より日常的なレベルでの質問に対する答えは「いいえ」です。
関数型プログラミングとは、プログラムが制御フローではなく関数の評価として概念化されていることを意味します。コードは関数の説明であり、制御フローの固有の概念はありません。
JavaScriptには制御フローがあり、命令型言語として概念化されています。その設計目標から、それは明らかに関数型言語ではありません。
「関数型プログラミング」言語という言葉は最近非常に多用されており、ほとんど役に立たない。2つの主要な意味があります。
あなたの意味を選んでください、そして質問は答えられます。
私にとって、Javascriptは命令型言語と関数型言語の両方であり、どちらの方法を使用することも、両方の方法(egad)を使用することもできます。または、1つのパラダイムを使用し、もう1つのパラダイムに決して触れないことを選択できます。それはあなた次第です。私は、あなたのように、Javascriptを関数型言語と呼ぶべきではないと思います。関数型プログラミングのパラダイムに出入りできるからです。おそらく、関数型プログラミングのパラダイムのみを使用することを制限するために、ある種のプラグマがあれば、それは有用だと思います。しかし、要約すると、それはいくつかの関数型プログラミング機能が組み込まれた命令型/手続き型言語であると言えます。
まあ、私はそれが関数型プログラミングだとは言いませんが、それから私は、それのオブジェクト指向とちょうど今日友人が、彼はどちらかその棚の上に置いていないと述べたと言います。
だから私はそうは言いませんが、私には意見の余地があると思います。関数型プログラミングの古典的な機能はありますが、他の機能はありません。
Javascriptはまともです。それは本当にそれをプログラミングする方法に依存します。OOの方法でコーディングした場合、それはOOではありませんか?したがって、「機能的」な方法でコーディングするだけで機能します。私はそれがマルチパラダイム言語であると思いますので、それを1つだけ呼ぶのは完全に正確ではありません。
私は「新しい」を得るためにあなたのコードを少し書き換える@petraszd ための演算子を:
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]())
})
しかし、この方法には大きなループの欠点があることは知っています...
PSここに投稿されましたcuzはコメントとして投稿中にコードのフォーマットに問題があります
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ページを作成しました。私の実装を複製/表示できます
私が本当にJavaScriptで嫌いなのは(あなたがそれをFP言語として見ようとするなら)これは:
function getTenFunctionsBad() {
var result = [];
for (var i = 0; i < 10; ++i) {
result.push(function () {
return i;
});
}
return result;
}
function getTenFunctions() {
var result = [];
for (var i = 0; i < 10; ++i) {
result.push((function (i) {
return function () {
return i;
}
})(i));
}
return result;
}
var functionsBad = getTenFunctionsBad();
var functions = getTenFunctions()
for (var i = 0; i < 10; ++i) {
// using rhino print
print(functionsBad[i]() + ', ' + functions[i]());
}
// Output:
// 10, 0
// 10, 1
// 10, 2
// 10, 3
// 10, 4
// 10, 5
// 10, 6
// 10, 7
// 10, 8
// 10, 9
このような動作を理解するには、JSスタック環境を理解する必要があります(適切な用語かどうかはわかりません)。
スキームの例では、あなたはそのようなものを作成することはできません(OK、OK-基礎となる言語の参照の助けを借りて、あなたはそれを作ることができます):
(define (make-ten-functions)
(define (iter i)
(cond ((> i 9) '())
(else (cons (lambda () i) (iter (+ i 1))))))
(iter 0))
(for-each (lambda (f)
(display (f))
(newline)) (make-ten-functions))