無限ループで乱数を生成する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. performSelectorInBackgroundを使用するリスク?
- 3. Apache mod_proxyを使用するリスク
- 4. ハスケルでハムズを使用する場合Yesodなしの場合
- 5. ASP.NETでJavaScriptを使用する場合
- 6. iPhoneでOpenGlを使用する場合
- 7. JSONでリストを使用する場合
- 8. Geventでスレッドプールを使用する場合
- 9. Railty - 使用する場合
- 10. データを使用するリスクは何ですか?image/jpeg; base64?
- 11. solを使用する場合のOOM
- 12. PHP:CURLを使用する場合のセキュリティ?
- 13. ウェブソケットを使用する場合のベストプラクティス?
- 14. ArgumentMatcherを使用する場合のNullPointerException
- 15. AppDomain.CurrentDomain.AssemblyResolveを使用する場合のメモリリーク
- 16. 目的Cコンベンション:使用する場合と使用する場合
- 17. HTML5モバイルアプリ - 単にUIWebViewを使用する場合、PhoneGapを使用する場合はいつですか?
- 18. Silverlightでエンティティを使用してLINQを結合する場合
- 19. static_castを使用して混合(ベース&派生)オブジェクトのベクトルを処理する場合のパフォーマンス上のリスクはありますか?
- 20. デフォルトを使用する場合とモデルのコンストラクタを初期化する場合
- 21. Facebookのログインを使用するセキュリティ上のリスク
- 22. IModelBinderとDefaultModelBinderを使用する場合
- 23. SemanticModel.GetSymbolInfoとSemanticModel.GetDeclaredSymbolを使用する場合
- 24. getXメソッドを使用する場合
- 25. C#/ C++を使用する場合
- 26. メソッドとオブジェクトを使用する場合
- 27. トレップを使用する場合
- 28. parseIntを使用する場合
- 29. TaskEx.RunとTaskEx.RunExを使用する場合
- 30. Magento - Mage :: getResourceModelを使用する場合
['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