質問

Word32、文字列(無視)、IO Word32のようないくつかのパラメータを取りますHaskellで機能を書きました。今、これは真の意味で関数です。同じ入力の場合、出力は常に同じです。副作用はありません。関数がWord32の代わりにIO WORD32を返す理由は、ファイナルワード32出力を計算するために、関数がループ内で数回多くの32ビット線形フィードバックシフトレジスタ(LFSR)および他のレジスタを更新することです。

私の質問はこれです。この関数効果的に副作用がないことが、関数の実装内でそれらのレジスタの更新を隠すことは、関数がWord32を返し、io Word32ではなくWord32を返すことは可能ですか?もしそうなら、?

役に立ちましたか?

解決

はい! Haskellはこれを行うことができます。

セントモナド

実際には、関数の外側のオブザーバーから完全に隠されている状態(レジスタ)を使用する場合は、 St Monad 、メモリ効果のみのモナド。 runSTを介してST Worldを入力し、機能を終了すると、すべての効果が表示されないことが保証されています。

局所的な変異型状態で作業するための正確な計算環境です。

純粋な機能状態:状態モナド

しかし、実際にはレジスタやセルを変更していないが、むしろ純粋に機能的な値を何度も更新する場合は、より簡単な環境が利用可能です。状態モナド。これは可変状態を可能にしませんが、地元の状態の錯覚を与えます。

io、unsaferperformio

最後に、ST Monadのようなローカル、可変の効果がある場合は、何らかの理由で、その状態(FFI呼び出しを介して)でIO操作が必要になるため、STをシミュレートすることができます。 unsafePerformIOの代わりにrunSTを使用して、Local IO環境を導入するために、ほとんど安全でMonad。 IOモナドが抽象化を強制するための素敵なタイプを持っていないので、副作用が観察できないことを手動で保証する必要があります。

他のヒント

FFIを使用してその機能をインポートした場合は、戻り値からIOを削除するだけです。それ以外の場合は、unsafePerformIO :: IO a -> aからSystem.IO.Unsafeを使用してください。この機能はHaskellで最も危険な機能の1つです。あなたがその結果について本当に堅調でないならば、それを使わないでください。しかし、あなたの目的のために、それは大丈夫です。

はい、これはUnsaferperFormioの正当な使用になります。 しかし、それはあなたが本当に目に見える効果がないと確信しているのであれば、大丈夫です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top