さて、の有効な使用法がありunsafePerformIO
ます。それは単に装飾的であるため、またはあなたの美徳をテストする誘惑としてそこにあるのではありません。ただし、これらの使用法には、日常のコードに意味のある副作用を追加することは含まれていません。さまざまな程度の疑いを持って、正当化される可能性のある使用例をいくつか示します。
内部的には不純であるが、外部から観察できる副作用がない関数をラップします。これはモナドと同じ基本的な考え方ですが、ST
ここでは不純物が「漏れない」ことを示す責任がプログラマーにある点が異なります。
何らかの制限された方法で故意に不純な機能を偽装する。たとえば、書き込み専用の不純物は、生成される出力を観察する方法がないため、「内部から」の完全な純度と同じように見えます。これは、モナドに必要な一貫性と明確に定義された順序を明示的に望まない、ある種のロギングまたはデバッグに役立ちます。IO
この例はDebug.Trace.trace
、私が時々呼ぶ、unsafePerformPrintfDebugging
です。
純粋な計算の内省、純粋な結果の生成。古典的な例は、明確な選択演算子のようなものです。これは、2つの同等の純粋関数を並行して実行して、より迅速に回答を得ることができます。
データの初期化時に非決定性を導入するなど、内部的に観察できない参照透過性の破壊。各不純関数が1回だけ評価される限り、同じ引数で呼び出された同じ偽純粋関数が異なる実行で異なる結果をもたらす場合でも、参照透過性はプログラムの1回の実行中に効果的に保持されます。
上記のすべてについて注意すべき重要なことは、結果として生じる不純物が注意深く制御され、範囲が制限されていることです。万能モナドよりも副作用を制御するよりきめ細かいシステムを考えると、これらはすべて、前述のモナドIO
の制御された可変状態のように、半純度のビットをスライスするための明白な候補になります。ST
スクリプト後:不必要な使用に対する強硬な姿勢unsafePerformIO
が検討されている場合は、禁止事項を拡張して、その動作を観察できる機能を含めることを強くお勧めします。unsafeInterleaveIO
あなたが私に尋ねれば、それは少なくともunsafePerformIO
私が上にリストしたいくつかの例と同じくらい大ざっぱです。