web-dev-qa-db-ja.com

高階関数は純粋関数を返します

これは、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が定数であり、内部状態(クラスなど)がない場合にのみ純粋と見なすことができます。

20
Francesco Meli

使用 純粋関数のこの定義

コンピュータプログラミングでは、純粋関数は次のプロパティを持つ関数です。

  1. その戻り値は、同じ引数に対して同じです(ローカル静的変数、非ローカル変数、可変参照引数、またはI/Oデバイスからの入力ストリームによる変動はありません)。

  2. その評価には副作用はありません(ローカル静的変数、非ローカル変数、変更可能な参照引数、またはI/Oストリームの変更はありません)。

その場合、nofunctionAは常に純粋関数を返すとは限りません。

純粋関数を返さないように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番目の条件にも違反する可能性があります)。

23
CRice

はい、返される関数は純粋であると見なすことができます。純粋であると見なされる理由は、まったく同じ入力が与えられた場合、関数は常に同じ出力を返すためです。

1
Brandon Kirk

返された関数は純粋関数と見なすことができます。あなたの例では、事実上4つの異なる純粋関数があります。

const pureFunc1 = functionA();
pureFunc1(4)   // => returns 4
pureFunc1(4)   // => returns 4

const pureFunc2 = functionA(2);
pureFunc2(4)   // => returns 8
pureFunc2(4)   // => returns 8

// ...
0
engineforce