例外の発生は、純粋または非純粋のいずれかであり、発生する例外のタイプに依存します。経験則として、例外がコードによって発生した場合は純粋ですが、ハードウェアによって発生した場合は通常、非純粋として分類する必要があります。
これは、ハードウェアによって例外が発生したときに何が起こるかを見るとわかります。最初に割り込み信号が発生し、次に割り込みハンドラーが実行を開始します。ここでの問題は、割り込みハンドラーが関数の引数でも関数内で指定されたものでもなく、グローバル変数であったことです。グローバル変数 (別名状態) が読み取られたり書き込まれたりするたびに、純粋な関数はなくなります。
これを、コードで発生する例外と比較してください。既知のローカル スコープの引数または定数のセットから Exception 値を作成し、結果を「スロー」します。グローバル変数は使用されていません。例外をスローするプロセスは、基本的に言語によって提供される構文糖衣であり、非決定論的または非純粋な動作を導入しません。Donが言ったように、「MaybeまたはOptionタイプを使用するのと意味的に同等である必要があります」。つまり、純度を含むすべての同じプロパティも持つ必要があります。
ハードウェア例外の発生は「通常」副作用として分類されると言ったとき、必ずしもそうである必要はありません。たとえば、コードが実行されているコンピューターが例外を発生させたときに割り込みを呼び出さず、代わりに特別な値をスタックにプッシュする場合、それは非純粋として分類できません。IEEE 浮動小数点 NAN エラーは、割り込みではなく特別な値を使用してスローされるため、浮動小数点演算の実行中に発生した例外は、値がグローバル状態から読み取られないため、副作用のないものとして分類できますが、 FPU にエンコードされた定数。
ピースコードが純粋で、コードベースの例外であり、ステートメントのシンタックスシュガーをスローするためのすべての要件を見ると、すべてのボックスにチェックマークが付けられ、状態を変更せず、呼び出し関数または呼び出し以外のものと相互作用しません。それらは参照透過的ですが、コンパイラがコードを処理した後でのみです。
すべての純粋な対非純粋な議論と同様に、実行時間やメモリ操作の概念を除外し、純粋に実装できる関数は実際の実装に関係なく純粋に実装されるという仮定の下で操作しました。また、IEEE 浮動小数点 NAN 例外の主張の証拠もありません。