関数で数を表す方法(二)閉パケットを導入する方法


現実の符号化では、このような式にもっと遭遇します.
g(f(x)+y,z)またはf(x,y,z)のような
そのため、多目的をどのように表現するかが問題になっています.
f(x,y)でx,yを表し,多目的呼び出しの場所でg(f(x,y))に書き換えるといえる.
言うまでもなく、g(x,f)をg(x)に書き換えることができても、f(x,y)はどんな方法で書き換えるのでしょうか.これは頭も尾もない問題になった.
議論の過程で多重演算の影響を除去するために,「閉パケット」というツールが導入された.閉包の役割は,多目演算を一元演算に簡略化できることである.例を見てください.
普段私たちが加算を書くのはこのように書いています.
var i = 3+4;
加算を完了するために関数を定義することもできます.
function add(a,b){return a+b;}

print(add(3,4));
これは少し馬鹿に見えます.しかし、その結果は同じです.
閉包して加算という二元演算を1元演算に変更することもできます
function add2(a){
  return function(b){
    return a+b;
  }
}

print(add2(3)(4));
鞄を閉じて慣れない子供靴について、ここで少し説明します.
print(add2(3)(4));

に分解
f = add2(3);
print(f(4));

add 2のソースコードを見ると、add 2は数ではなく匿名の関数を返します.この関数は何をしますか.4が入力されると、3+4が返され、5が入力されると、3+5が返されます.
これで二元関数を一元関数に変更します.
Javaしか習ったことがない子供靴はここできっと思いつくでしょう.「ええ、加算器を構築することができます.完成したことは同じです.」
その通り、伝統的なJavaではこう書くことができます
class adder = new Adder(3);
System.out.println(adder.add(4));
System.out.println(adder.add(5));
閉鎖に関する2つの事実が明らかになった.
1.現在、閉パッケージ特性をサポートしている言語は、基本的には類似クラスの構造によって閉パッケージを実現している.
2.閉パッケージは事実上の匿名クラス、一時クラスであり、閉パッケージのほとんどは匿名クラスであり、一時クラスが使用されている.
閉パッケージとクラスの最大の共通点は、内部でステータス値を維持できることです.
このように,中間状態値を保持する必要がなければ,閉パケットやクラスを使用する必要はない.Javaだけを学んだ子供靴は、この言葉を認めないに違いありません.彼らはあなたの耳元で抗議します.クラスは閉鎖よりも役に立ち、クラスはもっとfancierの特性を持っています.例えば、「継承」、「多態」などです.私は認めています.これらの特性はすべて役に立ちますが、時には私たちが解決しなければならない問題とは何の関係もありません.
例えば、多くの場合、私は結果を望んでいます.私は中間過程に関心を持っていません.ファイルをダウンロードする方法をこう書きます
function loadJSONDoc(url,callback)
{
	var xmlhttp=new XMLHttpRequest();
	if(callback){
		xmlhttp.onreadystatechange=function(){
			if (xmlhttp.readyState==4 && xmlhttp.status==200){
					callback(JSON.parse(xmlhttp.responseText));
			}
		  }; 
	}
	xmlhttp.open("POST",'/'+url,true);
	xmlhttp.send();
}

一般的なオブジェクト向けの方法では、次のようになります.
1.ダウンロードをカプセル化するオブジェクトを定義する必要があります.2.Eventオブジェクトをさらに定義して、伝達する必要があるデータ情報をカプセル化します.3.Ilistenerインタフェースをもう1つ定義する.ダウンロードが完了したかどうかを傍受するためにevent listenerをダウンロード器に追加します.5.listenerがダウンロードを傍受した後、ダウンロードしたコンテンツをステップ2のカスタムイベントにカプセル化し、dispatchというeventを外に出す.呼び出された場所では、まずステップ3のlistenerのインタフェースを実現します.newステップ1のカプセル化器のオブジェクト8.このオブジェクトにevent listenerを追加すると、Listenerインタフェースを実装するオブジェクトをリスニングする(あなたは標準的なインタフェースを使用していますか?そうでなければIDispatherをカスタマイズしなければなりません!、いいでしょう、あなたはまたあなたの前にある遠いクラスを継承したことを喜んで、このような種類はすでに展望的にこれらのインタフェースをすべて実現して、あなたがまだあなたのOOの実現のために自鳴して意を得ている時、この時新しいインタフェースが必要で、あなたの父はまたこのインタフェースを実現することを許可されない時、あなたはすぐに愚かになりました)9.listenerインタフェースの方法が呼び出されたとき、あなたはやっと欲しいものを手に入れることができました......Javaを勉強していたとき、私と私の同級生はその超大きなコード量、超煩雑な過程に抑止され、私たちは長い間忙しく働いていて、私たちが何をしているのか分かりませんでしたが、私たちはこれに疑問を示したことがありません.プログラミングはこのように煩わしくなければならないと思っていました.先生が教えてくれたので、Javaは世界で最も良い言語で、Javaをマスターしてあなたは他の言語を学ぶ必要はありません......過去の血の涙はもう言わないでください......ついにある日、あなたは我慢できなくて、静的な方法を書いて物をすべて中に投げ込んで事をしました.最終的には、リターン関数を通じてデータを取り出す必要があることに気づいたからです.
だから私は、最も忠実なOO信者でもこの観点に反対しないと信じています.問題をより高いレベルに抽象的に解決し、問題の本質を反映し、問題を解決するためにより大きな柔軟性を提供することができます.
常に低いレベルにとどまると、細部に遅れて最初の目的を忘れがちになります.
閉パケットは、クラスと構造のより高いレベルの抽象である.少し話が遠くなったので、次の章ではテーマに戻ります.
ps:新版のJavaとC++11は閉鎖をサポートするそうですが、20年後、やっと気づきました!
(続き)