はじめに 前回の記事「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 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)); 🎜>}