Today()は不純な関数です。その結果は、ユーザーが与えないものに依存しているためです。具体的には、現在のシステム時刻。したがって、呼び出しで提供された入力のみに基づく場合、その結果は決定的ではありません。
純粋な関数はになりますint Add(int a, int b) {return a + b;}
。この関数は与えられたものだけで機能し、他の外部状態データは使用しません。これの自然な結果は、あなたがAdd(2,2)
今から時間の終わりまで4を得ることができるということです。さらに、関数は外部状態を変更しないため(「副作用」はありません)、現在から2と2を時間の終わりまで追加()しても、システム内の他の部分は変更されません。関数の結果を変数に代入するか、値を使用して状態を更新します(関数自体が実行する操作ではありません)。事実上、古典的な数学演算はすべて純粋な関数であり、そのように実装できます。
今日は()、一方、よい行に2回呼び出されたときに同じ値を生成するが、数日間繰り返し呼び出されていない場合。これは、関数のパラメーターとして提供されていない外部状態データに依存しているためです。その結果、プログラムの境界内では、Today()関数の結果を制御することは不可能です。特定の日に特定の値を生成し、それが実行されているコンピューターのシステムクロックを変更しない限り、他の日にその値を生成することはありません(通常、プログラムの境界外で変更が発生します)。
不純な機能は必ずしも悪いことではありません。データストア、通信パイプライン、UIディスプレイ、周辺機器など、プログラムの境界の外側にあるものと対話するには、関数型言語であっても不純な機能が必要です。これらのことを何もしないプログラムはプログラムですその有用性は大幅に制限されています。入力を受け入れる手段や出力を通知する手段がないため、何もしないこともあるため、このようなプログラムを些細なものまで呼び出すことさえあります。関数型言語で記述されたプログラムは、ランタイムによって提供される入力のみを持ち、明示的に定義された不純なメソッドなしでランタイムにレポートされる出力を生成できますが、それはランタイムが不完全なコンピューターシステム内でのこれらの不純な詳細をすべて抽象化するためです
使用している関数のどれが純粋であり、どの関数がそうでないかを知ることは、とても良いことです。不純な機能は、物事を行うか、その使用法から明らかでない物事に依存しているため、使用法の知識のみが与えられた場合、予測できない動作をする可能性があります。それを使用するシステムを一貫性のある状態にし、決定論的な結果を期待するためには、関数の目的、したがって外部状態から必要なこと、または外部状態に対して行うことについてのさらなる知識が必要です。