web-dev-qa-db-ja.com

べき等関数は純粋関数と同じですか?

ウィキペディアのべき等の説明を読みました。関数の出力がその入力によって決定されることを意味することを私は知っています。しかし、私は非常によく似た概念、つまり純粋関数を聞いたことを覚えています。私はそれらをグーグルしますが、それらの違いを見つけることができません...

それらは同等ですか?

57
Lai Yu-Hsuan

べき等関数は、べき等の副作用を引き起こす可能性があります。

純粋関数はできません。

たとえば、テキストボックスのテキストを設定する関数はべき等です(複数の呼び出しで同じテキストが表示されるため)が、純粋ではありません。
同様に、GUID(カウントではない)によるレコードの削除は、後続の呼び出しの後も行が削除されたままであるため、べき等です。(追加の呼び出しは何もしません)

54
SLaks

純粋関数は副作用のない関数であり、出力は単独で入力によって決定されます-つまり、f(x)を呼び出しても同じ結果が得られます何度呼んでも。

べき等関数は、結果を変更せずに複数回適用できる関数です。つまり、f(f(x))f(x)と同じです。

関数は、純粋、べき等、両方、またはどちらでもない場合があります。

16
Anon.

機能的純粋性とは、副作用がないことを意味します。一方、べき等とは、関数が複数の呼び出しに関して不変であることを意味します。

純粋関数は、2回以上呼び出されても副作用を生成しないため、すべての純粋関数は副作用のべき等です。ただし、戻り値のべき等とは、f(f(x)) = f(x)これは純度の影響を受けないことを意味します。

4
jhuni

いいえ、べき等関数はプログラム/オブジェクト/マシンの状態を変更し、その変更を1回だけ行います(繰り返しの呼び出しにもかかわらず)。純粋関数は何も変更せず、呼び出されるたびに(戻り)結果を提供し続けます。

3
Brent Arias

混乱の大きな原因は、コンピュータサイエンスでは、命令型プログラミングと関数型プログラミングのべき等の定義が異なるように思われることです。

ウィキペディアから( https://en.wikipedia.org/wiki/Idempotence#Computer_science_meaning

コンピュータサイエンスでは、べき等という用語は、1回または複数回実行された場合に同じ結果を生成する操作を表すために、より包括的に使用されます。これは、適用されるコンテキストに応じて異なる意味を持つ場合があります。たとえば、副作用のあるメソッドまたはサブルーチン呼び出しの場合、変更された状態は最初の呼び出し後も同じままであることを意味します。ただし、関数型プログラミングでは、べき等関数は、任意の値xに対してプロパティf(f(x)) = f(x)を持つ関数です。

純粋関数は副作用を引き起こさないので、べき等は純粋とは何の関係もないと私は考えています。

2
lohfu