そのような使い方unsafePerformIO
は良くありません。
宣言primes :: [Int]
は、それprimes
が数字のリストであると述べています。何にも依存しない特定の数字のリスト。
ただし、実際には、定義がたまたま評価されるときのファイル「primes.txt」の状態に依存します。誰かがこのファイルを変更primes
して、持っているように見える値を変更する可能性がありますが、そのタイプによっては不可能なはずです。
メモリに完全に保存するのではなく、必要に応じて再計算する必要があると判断する仮想的な最適化が存在するprimes
場合 (結局のところ、その型は、再計算するたびに同じものを取得することを示しています)、primes
2 つの異なるものがあるように見えることさえあります。プログラムの 1 回の実行中の値。unsafePerformIO
これは、 を使用してコンパイラに嘘をつく場合に発生する可能性のある問題の一種です。
実際には、上記のすべてが問題になる可能性はほとんどありません。
しかし、理論的に正しいのはprimes
、グローバル定数を作成しないことです (定数ではないため)。代わりに、パラメータ化が必要な計算を行い (つまりprimes
、引数として取ります)、外側のプログラムでファイルを読み取り、プログラムがファイルから抽出しIO
た純粋な値を渡すことで純粋な計算を呼び出します。IO
両方の長所を活かすことができます。コンパイラに嘘をつく必要はありません。また、プログラム全体を .xml に入れる必要もありませんIO
。Reader モナドなどの構造を使用しprimes
て、どこでも手動で渡す必要がないようにすることができます (それが役立つ場合)。
unsafePerformIO
そのため、継続したい場合に使用できます。理論的には間違っていますが、実際に問題が発生する可能性は低いです。
または、実際に何が起こっているかを反映するようにプログラムをリファクタリングすることもできます。
または、primes
本当にグローバル定数であり、プログラム ソースに大量のデータを文字どおり含めたくない場合は、dflemstr で示されているように TemplateHaskell を使用できます。