Tôi đang tạo ứng dụng Haskell tạo ra một số ngẫu nhiên trên một vòng lặp vô hạn (chỉ khi có yêu cầu của khách hàng). Tuy nhiên, tôi chỉ nên sử dụng các hàm thuần túy cho mục đích đó. Có an toàn để bọc randomIO
với unsafeperformIO
mà không có bất kỳ sự ổn định hoặc hiệu suất quyết liệt nào không?Rủi ro khi sử dụng unsafeperformIO trên randomIO
Trả lời
Bất kỳ việc sử dụng nào của unsafePerformIO
phải được chứng minh bằng bằng chứng rằng giá trị kết quả vẫn thuần túy. Sự khắt khe của bằng chứng là tùy thuộc vào bạn và tầm quan trọng của công việc. Ví dụ: việc sử dụng thảm họa unsafePerformIO
và randomIO
này phải an toàn vì bạn có thể chứng minh rằng khi slowTrue
trả lại bất kỳ thứ gì, số này sẽ trả về 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
Định nghĩa hấp dẫn sau đây của một toàn cầu, các biến thể ngẫu nhiên là không an toàn:
rand :: Bool -> Int
rand True = unsafePerformIO randomIO
rand False = 0
Vấn đề là cùng một biểu thức bây giờ sẽ mang lại giá trị khác nhau:
main = do
print (rand True)
print (rand True)
in tại đây:
-7203223557365007318
-7726744474749938542
(ít nhất là khi được biên soạn mà không tối ưu hóa - nhưng điều đó chỉ nhấn mạnh sự mong manh của việc sử dụng không phù hợp của unsafePerformIO
).
Đó là một câu hỏi thú vị. Định nghĩa mức cao nhất 'unknown = unsafePerformIO randomIO' thực sự an toàn nếu trình biên dịch sẽ đánh giá nội dung của' unknown' chỉ một lần. Nhưng tôi khá chắc chắn rằng trình biên dịch có quyền inline nó và/hoặc tính toán nhiều lần. – ony
Tôi đã làm điều đó như là ví dụ đầu tiên, nhưng tôi không thể đánh dấu GHC đủ để làm cho điều đó thực sự có thể quan sát được, do đó ví dụ này. –
- 1. Rủi ro khi sử dụng Apache mod_proxy
- 2. Bất kỳ rủi ro nào khi sử dụng Macports?
- 3. Có rủi ro khi sử dụng @ Html.Raw không?
- 4. Rủi ro bảo mật khi bật MSDTC
- 5. rủi ro Django SECRET_KEY
- 6. Rủi ro bảo mật Javascript?
- 7. rủi ro của "Ad Hoc Distributed Queries"
- 8. Những rủi ro chính khi sử dụng ASP.NET MVC lần đầu tiên
- 9. Rủi ro bảo mật khi sử dụng XMLHttpRequest giữa nhiều miền là gì? người
- 10. Máy chủ SQL: Các rủi ro tiềm ẩn khi sử dụng DBCC SHRINKFILE
- 11. Có rủi ro bảo mật khi chạy các ứng dụng web trong debug = "true" không?
- 12. SQL Injection có phải là rủi ro hiện nay không?
- 13. Rủi ro của giao tiếp JSONP miền chéo là gì?
- 14. Rủi ro bảo mật của PermitUserEnvironment trong ssh
- 15. Rủi ro của việc sử dụng dữ liệu: image/jpeg; base64 là gì?
- 16. Mở xác thực 2.0 - Rủi ro bảo mật kế thừa
- 17. R quá tải nhà điều hành đơn nhất: rủi ro?
- 18. Có rủi ro liên quan đến việc sử dụng polyfill ràng buộc MDN không?
- 19. Tôi làm cách nào để cho phép người dùng chèn mã HTML mà không gặp rủi ro? (không chỉ rủi ro kỹ thuật)
- 20. Những rủi ro cụ thể của việc sử dụng các thuộc tính HTML tùy chỉnh là gì?
- 21. Python (hoặc lập trình chung). Tại sao nên sử dụng <> thay vì! = Và có rủi ro không?
- 22. Rủi ro của các phiên bản GCC khác nhau tại thời gian liên kết/chạy?
- 23. Mã GPGPU không đáng tin cậy (OpenCL vv) - có an toàn không? Rủi ro gì?
- 24. Tìm kiếm tài nguyên để giải thích rủi ro bảo mật
- 25. Điều khiển rõ ràng không thải bỏ chúng - rủi ro là gì?
- 26. amazon s3 đổi tên và ghi đè tập tin, khuyến nghị và rủi ro
- 27. Thông báo lỗi/ngoại lệ chi tiết có phải là rủi ro bảo mật không?
- 28. Chuyển đổi loại chung mà không có rủi ro Ngoại lệ
- 29. cách thích hợp để sao lưu/khôi phục cơ sở dữ liệu rủi ro là gì?
- 30. Rủi ro trong việc cho phép người dùng tải lên các tệp HTML/JS
Bạn nên sử dụng ['random'] (http://hackage.haskell.org/packages/archive/random/latest/doc/html/System-Random.html#v:random) hoặc [' randomR'] (http://hackage.haskell.org/packages/archive/random/latest/doc/html/System-Random.html#v:randomR) trong mã thuần túy. –
KHÔNG! Bạn có thể biện minh cho 'unsafeInterleaveIO' nhưng không có gì ngẫu nhiên là thuần khiết! –
@PhilipJF: "không có gì ngẫu nhiên thuần khiết"? Tôi muốn nói những điều như (không phải tại chỗ) quicksort với trục ngẫu nhiên là các thuật toán thuần túy hoàn toàn: ngẫu nhiên không thể được quan sát từ bên ngoài ngoại trừ thông qua các biến thể hiệu suất, mà chỉ có bất kỳ ý nghĩa trong đơn 'IO' anyway. – leftaroundabout