無限ループで乱数を生成するHaskellアプリケーションを作成しています(クライアントから要求された場合のみ)。しかし、私はその目的のために純粋な関数を使うべきです。劇的な安定性やパフォーマンスのリスクなしにrandomIO
をunsafeperformIO
に改行するのは安全ですか?randomIOでunsafeperformIOを使用する場合のリスク
答えて
unsafePerformIO
の使用は、結果値がまだ純粋であるという証拠によって正当化されるべきです。証拠の厳格さはあなた次第であり、仕事の重要性です。例えば、この哀れな使用unsafePerformIO
とrandomIO
は、がとなるので、安全でなければなりません。slowTrue
が何かを返すと、それはTrue
を返します。
import System.Random
import System.IO.Unsafe
import Data.Int
slowTrue = unsafePerformIO $ go
where
go = do
x1 <- randomIO
x2 <- randomIO
if ((x1 :: Int16) == x2) then return True else go
グローバル、おそらく確率変数の以下の魅力的な定義は安全ではありません。
main = do
print (rand True)
print (rand True)
プリント:
rand :: Bool -> Int
rand True = unsafePerformIO randomIO
rand False = 0
問題は、同じ式が今異なった値が得られるということですここに:
-7203223557365007318
-7726744474749938542
(少なくとも、最適化なしでコンパイルされたとき - しかし、それはちょうどunsafePerformIO
の不適切な使用の脆弱性を強調する)。
これは興味深い質問です。トップレベルの定義 'unknown = unsafePerformIO randomIO'は、コンパイラが' unknown'の本体を一度だけ評価する場合、実際には安全です。しかし、私は、コンパイラがそれをインライン化し、そして/または何度も計算する権利を持っていることを確信しています。 – ony
私はこれを私の例として最初に持っていましたが、私はそれを実際に観測可能にするのに十分なほどGHCをくすぐることはできませんでした。 –
- 1. aspnet_membershipを使用した場合のリスク
- 2. アクティビティをAPIのサプライヤとして使用する場合のリスク
- 3. performSelectorInBackgroundを使用するリスク?
- 4. Apache mod_proxyを使用するリスク
- 5. ghci randomio型推論
- 6. ハスケルでハムズを使用する場合Yesodなしの場合
- 7. Python 2.7で__init__を使用しない場合と使用する場合
- 8. データを使用するリスクは何ですか?image/jpeg; base64?
- 9. $ thisを使用する場合とシンプルな変数を使用する場合
- 10. JSONでリストを使用する場合
- 11. Angularjsで$ q.defer()を使用する場合
- 12. Geventでスレッドプールを使用する場合
- 13. iPhoneでOpenGlを使用する場合
- 14. Laravelでピボットテーブルを使用する場合
- 15. スイフトでプロトコルを使用する場合
- 16. ASP.NETでJavaScriptを使用する場合
- 17. ShippoでQUOTEを使用する場合
- 18. ループでレジスタを使用する場合
- 19. MongoDbでダイナミックコレクションを使用する場合
- 20. テーブルでエンコーディングを使用する場合
- 21. onclickの場合、 `onclick =" confirmOnSubmit() `vs` onclick = "confirmOnSubmit`を使用する場合
- 22. Javaの場合getterを使用する場合
- 23. SQL Serverクエリの場合完全クエリを使用する場合
- 24. Railty - 使用する場合
- 25. Facebookのログインを使用するセキュリティ上のリスク
- 26. HaskellのunsafePerformIOによるグローバル変数
- 27. AppDomain.CurrentDomain.AssemblyResolveを使用する場合のメモリリーク
- 28. MappedByteBufferを使用する場合のIndexOutOfBoundsException
- 29. カスタムクラスローダーを使用する場合のjava.lang.ClassCastException
- 30. PHP:CURLを使用する場合のセキュリティ?
['random'](http://hackage.haskell.org/packages/archive/random/latest/doc/html/System-Random.html#v:random)または[' randomR']を使用してください。 (http://hackage.haskell.org/packages/archive/random/latest/doc/html/System-Random.html#v:randomR)を参照してください。 –
NO!あなたは 'unsafeInterleaveIO'を正当化できるかもしれませんが、ランダムなものは純粋ではありません! –
@PhilipJF:「無作為なものは純粋ではない」?私はランダムなピボットのクイックソートは純粋なアルゴリズムだと言っています。ランダム性はパフォーマンスのバリエーションを除いて外部からは見ることができません。パフォーマンスのバリエーションは、IOモナドでは意味がありません。 – leftaroundabout