Ich erstellen eine Haskell-Anwendung, die eine Zufallszahl in einer Endlosschleife generiert (nur wenn von einem Client angefordert). Allerdings sollte ich für diesen Zweck nur reine Funktionen verwenden. Ist es sicher, randomIO
mit unsafeperformIO
ohne drastische Stabilität oder Leistungsrisiko zu wickeln?Risiken der Verwendung von unsafeperformIO auf randomIO
Antwort
Jede Verwendung von unsafePerformIO
sollte durch einen Nachweis gerechtfertigt werden, dass der resultierende Wert immer noch rein ist. Die Strenge des Beweises liegt bei Ihnen und der Wichtigkeit der Arbeit. Zum Beispiel sollte dieser erbärmliche Gebrauch unsafePerformIO
und randomIO
sicher sein, weil Sie beweisen können, dass, wenn slowTrue
irgendetwas zurückgibt, es True
zurückgibt.
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
Die folgende verlockend Definition eines globalen, ist möglicherweise Zufallsvariablen nicht sicher:
rand :: Bool -> Int
rand True = unsafePerformIO randomIO
rand False = 0
Das Problem ist, dass der gleiche Ausdruck nun unterschiedliche Werte ergeben wird:
main = do
print (rand True)
print (rand True)
Drucke hier:
-7203223557365007318
-7726744474749938542
(zumindest wenn kompiliert ohne Optimierungen - aber das betont nur die Fragilität der unsachgemäßen Verwendung von unsafePerformIO
).
Das ist eine interessante Frage. Die Definition auf oberster Ebene 'unknown = unsafePerformIO randomIO' ist eigentlich sicher, wenn der Compiler den Körper von' unknown' nur einmal auswerten wird. Aber ich bin mir ziemlich sicher, dass der Compiler die Rechte hat, ihn zu inline und/oder mehrfach zu berechnen. – ony
Ich hatte das zuerst als mein Beispiel, aber ich konnte GHC nicht genug kitzeln, um das tatsächlich beobachtbar zu machen, daher dieses Beispiel. –
- 1. Risiken der Verwendung von PHP eval
- 2. SQL Server: Versteckte Risiken bei der Verwendung von DBCC SHRINKFILE
- 3. unsafePerformIO- und FFI-Bibliotheksinitialisierung
- 4. Irgendwelche Risiken mit Macports?
- 5. Welche konkreten Risiken bestehen bei der Verwendung von benutzerdefinierten HTML-Attributen?
- 6. Django SECRET_KEY Risiken
- 7. Was sind die Risiken von PHP-Sitzungen?
- 8. Führen Sie einfache IO in Haskeline, innerhalb von InputT Monad, ohne auf unsafePerformIO
- 9. Welche Risiken bestehen bei Projekt Lombok?
- 10. Welche Risiken bestehen bei der Erhöhung der maximalen Ausgabepuffergröße?
- 11. R unäre Überlastung des Bedieners: Risiken?
- 12. Wie kann ich meinem Benutzer erlauben, HTML-Code ohne Risiken einzugeben? (nicht nur technische Risiken)
- 13. Risiken beim Senden großer Mengen von E-Mails über SMTP
- 14. Amazon S3 Umbenennung und Überschreiben von Dateien, Empfehlungen und Risiken
- 15. mit der Verwendung von +
- 16. Wie erstelle ich beim ersten Start eine Schaltfläche "Ich nehme alle Risiken bei der Verwendung dieser App an?"
- 17. Verwendung von DLL auf Server
- 18. Verwendung von Redis auf Azure
- 19. Verwendung von Boost auf Ubuntu
- 20. Verwendung von unordered_map auf Doppelfeld
- 21. Verwendung von Es6 auf Mokkazyklen
- 22. Punkt der Verwendung von NSPersistentStoreCoordinator?
- 23. Sicherheitsrisiken bei der Verwendung von eval() zum Ausführen von Benutzereingaben in JavaScript
- 24. Verwendung von ICSharpCode.TextEditor auf VB.NET
- 25. Verwendung von Lambda auf lower_bound
- 26. Die Verwendung der Konfigurationsdatei entspricht der Verwendung von Globals?
- 27. Leistungseinfluss der Verwendung von CDI
- 28. Konfigurieren der Verwendung von AppIdentityService auf dem Entwicklungsserver
- 29. Problem Zugriff auf XML nach der Verwendung von Simplexml
- 30. Zugriff auf Glassfish serviert Inhalt bei der Verwendung von localhost
Sie sollten ['random'] (http://hackage.haskell.org/packages/archive/random/latest/doc/html/System-Random.html#v:random) oder [' randomR'] verwenden (http://hackage.haskell.org/packages/archive/random/latest/doc/html/System-Random.html#v:randomR) in reinem Code. –
NEIN! Du könntest 'unsafeInterleaveIO' rechtfertigen, aber nichts Zufall ist rein! –
@PhilipJF: "Nichts Zufälliges ist rein"? Ich würde sagen Dinge wie (Not-in-Place) Quicksort mit zufälliger Pivot sind reine Algorithmen in Ordnung: Die Zufälligkeit kann von außen nicht beobachtet werden, außer durch Performance-Variationen, die sowieso nur irgendeine Bedeutung in der 'IO'-Monade haben. – leftaroundabout