ホームページ ウェブフロントエンド jsチュートリアル JavaScript 関数プログラミングの例分析_JavaScript スキル

JavaScript 関数プログラミングの例分析_JavaScript スキル

May 16, 2016 pm 04:02 PM
javascript 関数型プログラミング

この記事の例では、JavaScript 関数プログラミングについて説明します。皆さんの参考に共有してください。具体的な分析は次のとおりです。

JS は、他の動的言語と同様に、高階関数を記述することができます。いわゆる高階関数は、関数を操作できる関数です。なぜなら、js では関数は完全なオブジェクトであり、関数型プログラミングの前提条件を提供する第一級の市民に属しているからです。

以下は、js チュートリアルのコード例です。その機能は、配列要素の平均と標準偏差を計算することです。まず、非関数型プログラミングの記述方法をリストします。

var data = [1,1,3,5,5];
var total = 0;
for(var i = 0;i < data.length;i++)
  total += data[i];
var mean = tatal/data.length; //平均数为3
//计算标准差
total = 0;
for(var i = 0;i < data.length;i++){
  var deviation = data[i] - mean;
  tatal += deviation * deviation;
  }
var stddev = Math,.sqrt(total/(data.length-1));//标准差为2
ログイン後にコピー
関数型プログラミングを使用するために、いくつかのヘルパー関数を事前定義します。

//将类数组对象转换为真正的数组
function array(a,n){
 return Array.prototype.slice.call(a,n||0);
}
//将函数实参传递至左侧
function partial_left(f){
 var args = arguments;
 return function(){
  var a = array(args,1);
  a = a.concat(array(arguments));
  return f.apply(this,a);
 };
}
//将函数的实参传递至右侧
function partial_right(f){
 var args = arguments;
 return function(){
  var a = array(arguments);
  a = a.concat(array(args,1));
  return f.apply(this,a);
 };
}
//该函数实参被用做模版,
//实参列表中的undefined值会被实际实参值填充。
function partial(f){
 var args = arguments;
 return function(){
  var a = array(args,1);
  var i = 0,j = 0;
  for(;i<a.length;i++)
   if(a[i] === undefined)
    a[i] = arguments[j++];
  a = a.concat(array(arguments,j));
  return f.apply(this,a);
 };
}
//返回一个函数类似于f(g())
function compose(f,g){
 return function(){
  return f.call(this,g.apply(this,arguments));
 };
}
ログイン後にコピー
以下に、関数型プログラミングを完全に使用して js コードを示します。

var data = [1,1,3,5,5];
var sum = function(x,y){return x+y;};
var product = function(x,y){return x*y;};
var neg = partial(product,-1);
var square = partial(Math.pow,undefined,2);
var sqrt = partial(Math.pow,undefined,0.5);
var reciprocal = partial(Math.pow,undefined,-1);
//好吧,高潮来鸟 :)
var mean = product(reduce(data,sum),reciprocal(data.length));
var stddev = sqrt(product(reduce(map(data,compose(square,partial(sum,neg(mean)))),sum),reciprocal(sum(data.length,-1))));
ログイン後にコピー
reduce 関数と map 関数を除いて、その他の関数は上記に示しています。 Reduce 関数は、Ruby の Inject 関数に似ています。

ary = (1..10).to_a
ary.inject(0) {|sum,i|sum + i} //结果为55
ログイン後にコピー
js は次のように記述されます:

var ary = [1,2,3,4,5,6,7,8,9,10]
ary.reduce(function(sum,i){
 return sum + i;
},0);
ログイン後にコピー
0 は sum の初期値です。省略した場合、sum は配列の最初の要素の値になります。ここでは省略できます。

map 関数も非常に単純で、配列の各要素を操作し、操作後に配列を返すのと似ています。js コードは次のようになります。 >

a = (1..3).to_a; #数组[1,2,3]
a.map {|x| x*2} #返回新数组[2,4,6]
ログイン後にコピー
その長いコード文字列を分析してみましょう:)

sum と product は要素を加算および乗算する関数を定義します。

neg は、product(-1,x) と同等の関数でもあり、負の x 値を意味します。

square 関数は Math.pow(x,2) と同等であり、x の 2 乗値を計算します。ここでは、partial の 2 番目のパラメーターが未定義であることに注意してください。つまり、ここでの仮パラメーターは、最初の実パラメータを入力します。明確にしておきます。square(x) 関数は Math.pow(x,2) と同じです。

sqrt 関数は square に似ており、その関数は Math.pow(x,0.5) と同等であり、x の平方根を計算するのと同等です。

最後の関数 reciprocal は、Math.pow(x,-1) と同等です。つまり、x の負のべき乗を計算することは、x の逆数を計算することと同じです。

上記の関数を組み合わせる方法は次のとおりです :)

まず平均の計算を見てみましょう。これは非常に簡単です。最初に配列要素の合計を計算し、それを配列長の逆数、つまり配列の合計/配列長で乗算します。

最後に、一見難しそうな標準偏差を、内側から外側に見てみるとよいでしょう:

まず、ネガを含むレイヤーを見てください:


以下の作成関数を見てください:
//等价于函数sum(-1 * mean + x)
partial(sum,neg(mean)
ログイン後にコピー

マップ関数を見てみましょう:
//下面在源代码上做了等价替换,可以再次等价于:
//square(sum(-1*mean + x)),再次展开(我剥,我剥,我剥洋葱...):
//Math.pow(sum(-1*mean + x),2);
compose(square,sum(-1*mean + x))
ログイン後にコピー
//とてもわかりやすいですね! ?つまり、データ内の各要素は平均であり、その結果を 2 乗します。

次に、マップの外側にあるreduce関数を見てみましょう:
map(data,Math.pow(sum(-1*mean + x),2))
ログイン後にコピー

次に、逆関数を見てみましょう:
//将前面新数组的每个元素值加起来。
reduce(map(...),sum)
ログイン後にコピー

外積関数を見てください:
//等价于求(data.length-1)的倒数
reciprocal(sum(data.length,-1))
ログイン後にコピー

最も外側の sqrt は、上記の除算の結果の平方根を求めることを意味します。これを前の非関数型プログラミング コードと比較できます。これは同じです:) これは非常に複雑なコードのようです。怖いけど、分析すると難しくてすぐにゼロになってしまいます。読者の皆さんが、「結局わからない」という場合は、完全にうちの猫の言語表現能力の問題ですので、ぜひ質問してください。
//等价于新数组元素的和除以(data.length-1)
product(reduce(...),reciprocal(...))
ログイン後にコピー
説明は終わり、戦いも終わり、これで終わりです。

この記事が皆様の JavaScript プログラミング設計に役立つことを願っています。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

簡単な JavaScript チュートリアル: HTTP ステータス コードを取得する方法 簡単な JavaScript チュートリアル: HTTP ステータス コードを取得する方法 Jan 05, 2024 pm 06:08 PM

JavaScript チュートリアル: HTTP ステータス コードを取得する方法、特定のコード例が必要です 序文: Web 開発では、サーバーとのデータ対話が頻繁に発生します。サーバーと通信するとき、多くの場合、返された HTTP ステータス コードを取得して操作が成功したかどうかを判断し、さまざまなステータス コードに基づいて対応する処理を実行する必要があります。この記事では、JavaScript を使用して HTTP ステータス コードを取得する方法を説明し、いくつかの実用的なコード例を示します。 XMLHttpRequestの使用

JavaScript で HTTP ステータス コードを簡単に取得する方法 JavaScript で HTTP ステータス コードを簡単に取得する方法 Jan 05, 2024 pm 01:37 PM

JavaScript で HTTP ステータス コードを取得する方法の紹介: フロントエンド開発では、バックエンド インターフェイスとの対話を処理する必要があることが多く、HTTP ステータス コードはその非常に重要な部分です。 HTTP ステータス コードを理解して取得すると、インターフェイスから返されたデータをより適切に処理できるようになります。この記事では、JavaScript を使用して HTTP ステータス コードを取得する方法と、具体的なコード例を紹介します。 1. HTTP ステータス コードとは何ですか? HTTP ステータス コードとは、ブラウザがサーバーへのリクエストを開始したときに、サービスが

関数プログラミングに C++ ラムダ式を使用する利点は何ですか? 関数プログラミングに C++ ラムダ式を使用する利点は何ですか? Apr 17, 2024 am 10:18 AM

C++ ラムダ式は、関数型プログラミングに次のような利点をもたらします。 シンプルさ: 匿名インライン関数により、コードの可読性が向上します。コードの再利用: コードの再利用を容易にするために、ラムダ式を渡したり保存したりできます。カプセル化: 別の関数を作成せずにコードの一部をカプセル化する方法を提供します。実際のケース: リスト内の奇数をフィルタリングします。リスト内の要素の合計を計算します。ラムダ式は、関数型プログラミングの簡素化、再利用性、カプセル化を実現します。

遅延評価を使用して Golang 関数型プログラムを最適化するにはどうすればよいですか? 遅延評価を使用して Golang 関数型プログラムを最適化するにはどうすればよいですか? Apr 16, 2024 am 09:33 AM

Go では、遅延データ構造を使用して遅延評価を実装できます。実際の値をカプセル化し、必要な場合にのみ評価するラッパー型を作成します。関数型プログラムでのフィボナッチ数列の計算を最適化し、実際に必要になるまで中間値の計算を延期します。これにより、不要なオーバーヘッドが排除され、関数型プログラムのパフォーマンスが向上します。

Python ラムダ式: 省略、簡潔、強力 Python ラムダ式: 省略、簡潔、強力 Feb 19, 2024 pm 08:10 PM

pythonLambda 式は、簡潔で読みやすく、使いやすいコードを作成するための強力で柔軟なツールです。これらは、他の関数に引数として渡したり、変数に保存したりできる匿名関数をすばやく作成するのに最適です。 Lambda 式の基本構文は次のとおりです。 lambdaarguments:expression たとえば、次の Lambda 式は 2 つの数値を加算します: lambdax,y:x+y この Lambda 式は、次のように引数として別の関数に渡すことができます。 defsum( x ,y):returnx+yresult=sum(lambdax,y:x+y,1,2) この例では

Golang 関数型プログラミングのよくある間違いと落とし穴 Golang 関数型プログラミングのよくある間違いと落とし穴 Apr 30, 2024 pm 12:36 PM

Go で関数型プログラミングを使用する場合に注意すべき 5 つの一般的な間違いと落とし穴があります。 参照を誤って変更することを避け、新しく作成された変数が返されるようにしてください。同時実行の問題を解決するには、同期メカニズムを使用するか、外部の可変状態のキャプチャを避けます。コードの可読性と保守性を向上させるために、部分的な機能化は控えめに使用してください。アプリケーションの堅牢性を確保するために、常に関数内のエラーを処理してください。パフォーマンスへの影響を考慮し、インライン関数、フラット化されたデータ構造、操作のバッチ処理を使用してコードを最適化します。

Python ラムダ式: 匿名関数の威力を明らかにする Python ラムダ式: 匿名関数の威力を明らかにする Feb 24, 2024 am 09:01 AM

Python のラムダ式は、匿名関数の別の構文形式です。これは、プログラム内のどこにでも定義できる小さな匿名関数です。ラムダ式はパラメータ リストと式で構成されます。式には有効な Python 式を使用できます。ラムダ式の構文は次のとおりです: lambdaargument_list:expression. たとえば、次のラムダ式は 2 つの数値の合計を返します: lambdax,y:x+y. このラムダ式は、マップなどの他の関数に渡すことができます。 () 関数:数値=[ 1,2,3,4,5]結果=マップ(ラムダ

他の関数型プログラミング言語と比較した Java 関数の長所と短所は何ですか? 他の関数型プログラミング言語と比較した Java 関数の長所と短所は何ですか? Apr 24, 2024 pm 02:51 PM

Java 関数型プログラミングの利点には、単純さ、構成可能性、同時実行性、テストのしやすさ、パフォーマンスなどがあります。欠点としては、学習に時間がかかること、デバッグが難しいこと、柔軟性が限られていること、パフォーマンスのオーバーヘッドが挙げられます。その主な機能には、副作用のない純粋な関数、データ処理パイプライン、ステートレス コード、効率的なストリーミング API が含まれます。

See all articles