11

純粋関数は外部メソッドを呼び出すことができますか?

例えば:

class Dog {
  function jump(name) {
    return "a dog named " + name + " jumped!"
  }

  function jumpTwice(names) {
    var result = [];
    for (var i = 0; i < 2; i++) {
       result.push(jump(names[i]));
    }
    return result.join("\n");
  }

}

jumpTwice()と見なすことができますpure functionか?

4

3 に答える 3

16

できるとき

純粋なf関数は、他の関数/メソッドを呼び出すことができますg0...gn。しかし、純粋g0...gnでなければなりません。

できないとき

純粋な関数を取得し、内から非純粋な関数fを呼び出すとすぐに、 は純粋ではなくなります。gff

于 2016-09-14T19:12:39.000 に答える
0

あなたが与える特定のケースでは、はい。しかし、そこにあるのはメソッドであり、メソッドには特別な注意が必要です。

純粋な関数は、現在のプログラムの状態に関係なく、任意の入力に対して常に同じ結果を返します。メソッドは、オブジェクトが隠しパラメーターとして渡される関数と見なすことができます。純粋であるためには、メソッドは暗黙的な状態にアクセスしてはなりません (また、暗黙的な状態の影響を受けやすい他のメソッド/関数を呼び出すこともできません)。これは、暗黙の状態を含むオブジェクト フィールドを使用しないことも意味します。コメントの議論は、うまくいけば、その文脈を判断する方法の例を示します.

可変フィールドを避けるだけでは十分ではありません。不変フィールド フィールドの値は、既知/予測可能でなければなりません。たとえば、オブジェクトの作成時に乱数が与えられた不変のプライベート フィールドがオブジェクトに含まれている場合、その値を使用してその出力を計算するメソッドは不純になります。

一方、Dog クラスに、オブジェクトの作成時に設定された不変の name フィールドがある場合、そのフィールドを使用するメソッドは純粋であると見なすことができます (他の何かが不適格としない限り)。

編集

「副作用」と「純度」は文脈に依存していると言うのは役に立ちました(コメントで議論されているように)。これは、「知っている」および「予測可能」という言葉を使用して、完全に明確に暗示していないことです。コメントの議論は、コンテキストを知ることの重要性を示しています。

于 2016-09-14T21:18:15.383 に答える
0

はい、それは純粋です。グローバルな状態を変更したり、同じ入力に対して異なる結果を与えたりすることはありません。

于 2016-09-14T19:02:29.337 に答える