Haskell で記述されたプログラミング言語インタープリターに IO 関数を追加するには、基本的に 2 つのオプションがあります。
- インタプリタ全体を IO モナド内で実行するように変更します
- 解釈されたプログラムによって呼び出すことができる実行時関数を使用します
unsafePerformIO
。
前者は私には悪い考えのように感じます。これは、プログラムのほぼすべての場所に到達することにより、 純度の利点を効果的に無効にします。IO
私も現在頻繁に使用しST
ており、これを達成するには大量のプログラムを変更する必要があります.ST
IO
後者は私を緊張させます-関数名が示すように、安全ではありませんが、この状況では正当化される可能性があると思います. 特に:
- この変更によって変更されるコードの量はごくわずかです。
- IO が実行される可能性のある
seq
ポイントは、解釈された式の評価中に at コントロール ポイントを使用することによって、既に明示的に順序付けられています。 - おそらくもっと重要なことは、IO アクションによって返される値は、コードの解釈されたセクション内でのみ使用されることです。ここでは、操作カウンターがスレッド化されるため、同じ引数でインタープリターを複数回呼び出すことができないという事実によって、参照の透過性を保証できます。システム全体が同じ変更の一部であり、を使用するすべての関数に常に一意の値が渡されます
unsafePerformIO
。
この状況で、使用しない正当な理由はありますunsafePerformIO
か?
アップデート
インタプリタで純粋さを保ちたい理由を尋ねられました。いくつかの理由がありますが、おそらく最も差し迫ったのは、後でこの言語用のコンパイラを構築するつもりであり、言語には、コンパイラにインタープリターを含める必要があるさまざまなメタプログラミング手法が含まれるということですが、私はそうしたいと考えています。コンパイル結果の純度を保証できます。言語にはこの目的のための純粋なサブセットがあり、そのサブセットを実行するときにインタープリターが純粋であることを望みます。