関数式プログラミング学習(概要)
2552 ワード
高次関数
個人的な理解は、関数をパラメータとするネストされた関数の作成方法であり、論理が明確になるメリットがあります.
Currying(コリー化)
本から直観的な感じは1つの大きい関数を複数の関数に分解して共同で処理する方式で、目的は関数のパラメータの数を減らすためで、急速に関数をカプセル化します.例:
int pow(int i, int j);
int square(int i)
{
return pow(i, 2);
}
ふかっせいひょうか
関数式プログラミングの大きな環境では、コードブロックは同時実行可能であるが、同時実行を必要としない場合もあり、同時プログラムの1つまたは2つの実行だけを必要とする場合もある.それでは、そんなに多くのリソースを浪費しないために、関数式プログラミングではシーケンスを順番に実行する必要はなく、関数が同時プログラムを呼び出す必要があるときだけ、このプログラムを実行する.このような関数実行方式を不活性評価と呼ぶ.
unless(stock.isEuropean()) {
sendToSEC(stock);
}
void unless(boolean condition, List code) {
if(!condition)
code;
}
ここでの制御構造はjsのコールバック関数と理解でき,パラメータの関数は直ちに実行されず,コードで実行する必要がある場合に実行される.
プログラムの関数式実行を保証するとともに,キーボードなどの入力の制御性も保証するため,Continuation命令式プログラミングを導入した.
通常、関数は必ず戻り値を呼び出し元に返す必要がありますが、Continuationの導入では、関数の値を呼び出し元に戻すのではなく、プログラムに返す任意のコードを許可することができます.簡単に例を挙げると、次のようになります.
//
int i = add(5, 10);
int j = square(i);
//cps
int j = add(5, 10, square);
cps(Continuation Pass Style)の書き方を使用する場合、addに1つのパラメータが追加され、計算結果がsquareに入力される必要があることを保証します.この作成過程で依存関係があるからです.
パターンマッチング
マッチングモードが主に適応するシーンは、ブランチを判断したり、複雑なネスト文を実装したりする場合、マッチングモードが複雑なブランチやネストをよりよく複数の新しい関数に分割することです.
クローズドパッケージ
まず、cのプログラムをjsで書き直しました.
function pow(a,b){
return a*b
}
function makePowerFn(power) {
function powerFn( base){
return pow(base,power)
}
return powerFn
}
var square = makePowerFn(2);
console.log(square(3))//6
ここで使用するmaPowerFnがパラメータ2に入力されると、square関数は別の関数を返します.square関数を直接呼び出すと、所望の結果が得られますが、問題はpower伝達パラメータがpowerFn関数のドメイン内にないことです.makePowerFnは結果を返しているので、スタックも存在しません.
ではsuqareはどのように働いていますか?この場合、squareの後で使用し続けるために、powerの値を格納し続けることを何らかの方法でサポートする言語が必要です.では、もう一つの関数、cubeを定義してキューブを計算するとしたら、どうすればいいのでしょうか.実行中のプログラムは、makePowerFnで生成された2つの関数にそれぞれ使用される2つのパワーの値を格納する必要があります.このような変数値を保存する方法をclosureと呼ぶ.closureは、ホスト関数のパラメータ値だけでなく、次の例でも使用できます.
var makeIncrement = () => {
var i = 0
return increment = () =>{
return ++i
}
}
var demo1 = makeIncrement()
var demo2 = makeIncrement()
console.log(demo1(),demo1(),demo1())//1,2,3
console.log(demo2(),demo2(),demo2())//1,2,3
プログラム実行はiの値を格納するだけでなく、後続のプログラムアクセスのために、iを無限にコピーします.