純粋な機能に関して質問があります。ウィキペディアのページによると、純粋な関数の必要条件の1つは次のとおりです。
結果を評価しても、可変オブジェクトの変更やI / Oデバイスへの出力など、意味的に観察可能な副作用や出力は発生しません。
さて、これは本当に何を意味するのでしょうか。または、意味的に観察できない副作用をどのように作成できますか?
純粋な機能に関して質問があります。ウィキペディアのページによると、純粋な関数の必要条件の1つは次のとおりです。
結果を評価しても、可変オブジェクトの変更やI / Oデバイスへの出力など、意味的に観察可能な副作用や出力は発生しません。
さて、これは本当に何を意味するのでしょうか。または、意味的に観察できない副作用をどのように作成できますか?
回答:
プログラムのセマンティクスは、科学モデルと同様に、学習したくない側面を無視する、その動作のモデルです。
プログラムの実行の非常に詳細なモデルは、実行時間、消費電力、電磁放射などを含む、プログラムを実行するコンピューターの物理的な動作をモデル化します。これらの側面は、ほとんど関連しないため、ほとんど考慮されません。それにもかかわらず、それらは時々重要です:飛行機の自動操縦の有用なモデルにはランタイム情報を含める必要があり、クレジットカードのセキュリティの有用なモデルには電磁放射を含める必要があります...
典型的なセマンティクスでは、タイミングや消費電力などの副作用は無視されます。Haskellインタプリタプロンプトで式を入力する一般的な設定であっても、結果の印刷は副作用です(無限のオブジェクトを印刷しようとすると問題になります)。Haskellインタープリターのメモリが不足すると、これは「実世界」モデルで観測可能な副作用ですが、無制限の計算を効果的に可能にする理想的なHaskellモデルではありません。
観察可能な副作用は、セマンティクスでモデル化したものです。プログラミング言語の典型的なモデルでは、メモリ消費はモデル化されていないため、1TBのストレージを必要とする計算は、PCで実行しようとしても明らかに失敗する可能性がありますが、純粋な場合があります。
別の種類の観察不可能な副作用は、関数の内部にあるものです。これは、ほとんどの意味論者が観察できない副作用について話すときに考えるものだと思います。内部で可変データを使用するが、プログラムの他の部分とこの可変データを共有しない計算を検討してください。たとえば、リストと同じ要素を持つ配列を構築し、配列を所定の位置に並べ替え、最終的な順序で配列として要素を含むリストを返すリスト並べ替え関数:この関数の部分式の意味モデルは、効果(配列の変更)ですが、関数自体には外部副作用がないため、純粋です。
より微妙な例として、いくつかのデータを一時ファイルに書き込み、それ自体をクリーンアップする関数を考えてください。一時ファイルのための十分なスペースが常にあり、プログラムが一時ファイルを共有しないセマンティクスでは、この関数には副作用はありません。一時ファイルは、関数が使用する追加メモリとして機能します。ファイルシステムの完全な条件を考慮するセマンティクスでは、この関数には副作用があります。外部環境により失敗する可能性があります。マシンをクラッシュさせるセマンティクスでは、関数には副作用があります。関数の実行中にクラッシュが発生すると、一時ファイルが残る場合があります。同時に実行されるプログラムが一時ファイルを参照して変更できるセマンティクスでは、この関数には副作用があります。