これは、customValueを入力として持ち、入力を取得し、カスタム値を使用して結果を作成する関数を返すfunctionAと呼ばれる高階関数の例です。
let functionA = (customValue) => {
let value = customValue || 1;
return input => input * value;
};
結果は次のとおりです。
functionA()(4)
// => returns 4
functionA(2)(4)
// => returns 8
functionA(3)(4)
// => returns 12
functionA(4)(4)
// => returns 16
FunctionAによって返される関数は純粋であると見なすことができますか?
[〜#〜] update [〜#〜]:上記の例は数値入力のみを使用しています。 @CRiceで説明されているように、返される関数は、customValueが定数であり、内部状態(クラスなど)がない場合にのみ純粋と見なすことができます。
使用 純粋関数のこの定義 :
コンピュータプログラミングでは、純粋関数は次のプロパティを持つ関数です。
その戻り値は、同じ引数に対して同じです(ローカル静的変数、非ローカル変数、可変参照引数、またはI/Oデバイスからの入力ストリームによる変動はありません)。
その評価には副作用はありません(ローカル静的変数、非ローカル変数、変更可能な参照引数、またはI/Oストリームの変更はありません)。
その場合、no、functionA
は常に純粋関数を返すとは限りません。
純粋関数を返さないようにfunctionA
を使用する方法は次のとおりです。
let functionA = (customValue) => {
let value = customValue || 1;
return input => input * value;
};
class Mutater {
constructor() {
this.i = 0;
}
valueOf() {
return this.i++;
}
}
const nonPureFunction = functionA(new Mutater());
// Produces different results for same input, eg: not pure.
console.log(nonPureFunction(10));
console.log(nonPureFunction(10));
ご覧のとおり、同じ入力(10
)、異なる結果を生成します。これは、上記の定義の最初の条件に違反します(同じトリックを使用すると、2番目の条件にも違反する可能性があります)。
はい、返される関数は純粋であると見なすことができます。純粋であると見なされる理由は、まったく同じ入力が与えられた場合、関数は常に同じ出力を返すためです。
返された関数は純粋関数と見なすことができます。あなたの例では、事実上4つの異なる純粋関数があります。
const pureFunc1 = functionA();
pureFunc1(4) // => returns 4
pureFunc1(4) // => returns 4
const pureFunc2 = functionA(2);
pureFunc2(4) // => returns 8
pureFunc2(4) // => returns 8
// ...