ホームページ >ウェブフロントエンド >jsチュートリアル >JavaScriptの代表的な高階関数応用入門2_JavaScriptスキル

JavaScriptの代表的な高階関数応用入門2_JavaScriptスキル

WBOY
WBOYオリジナル
2016-05-16 17:44:13975ブラウズ
はじめに
前回の記事「JavaScript の代表的な高階関数」では、主にいくつかの代表的な関数関数を実装しました。この記事では最後に、なぜその実装が F# などの関数型言語と「異なる」のかという疑問も提起されています。今日はより「機能的な」実装を試してみましょう。

別の実装
同様に、以前に実装された関数にいくつかの変更を加え、for ループを削除してみます。削除するにはどうすればよいですか?ここで最初に集合の帰納的定義を紹介します:

集合は空の集合、または数値と集合からなる数値のペアのいずれかです。この定義から、各集合とみなすことができることがわかります。数値とペアのセットとして。たとえば、{1,2,4,5} は、数値 1 と集合 {2,4,5} で構成されるペアと見なされ、(1, {2,4,5}) と記述されます。再帰的に、{2,4,5} は (2, {4,5}) として表示されます。最後に (5, Ø) です。この理解に基づいて、分解中にすべてのデータ項目を参照し、最終条件が空集合であるため、再帰的手法を使用してループを排除できます。フィルター関数の別の実装を見てみましょう。元の関数名には、前の関数と区別するために f という接頭辞が付いています。
コード コードは次のとおりです:
function ffilter(arr,callback){
var i=arguments[2] || 0,
out = argument[3] ] || [];
if (!arr[i]) 戻り値 [3];
out.push(arr[i]); 🎜>return argument.callee(arr,callback , i,out);
}


テスト:


コードをコピー コードは次のとおりです。 var arr = [1,2,3,4,5,6,7,8,9,10]; var Even = function(item){
if( typeof item !== "number") return
return !(item & 1)
}; arr,even));


結果:
[2, 4, 6, 8, 10] ループを削除すると、数学の帰納的定義に近くなり、より自然に見えます。同様に、ffold 関数をもう一度見てみましょう:



コードをコピーします
コードは次のとおりです: var arr = [1,2,3,4,5,6,7,8,9,10]; var plus = function(a,b){ return a b;
console .log(ffold(arr,plus,3));


結果:
58
他の関数にも同じ方法を使用します。これはより関数的に感じられますが、数学的な定義に近づけることはできるでしょうか?次回もう一度試してください。
==========2013.1.8 Update==================
上記の通り、書き方がより近づけられるかどうか数学的定義を理解するには、リンク リストを使用してみましょう。まず定義を与えます:




コードをコピー

コードは次のとおりです: var node = function () { this.data = 0; this.tail = null
別のリンクされたリストを初期化します。 🎜>


コードをコピーします

コードは次のとおりです:
var n1 = 新しいノード(),n2 = 新しいノード( ),n3 = 新しいノード(),n4 = 新しいノード(),n5 = 新しいノード();
n1.data=1,n1.tail=n2;

コードをコピー


コードは次のとおりです:


function lfold(head,callback ,b){
if(!head) return b;
else return callback(head.data,arguments.callee(head.tail,callback,b)); 🎜>}
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。