gpt4 book ai didi

haskell - 在 randomIO 上使用 unsafeperformIO 的风险

转载 作者:行者123 更新时间:2023-12-04 13:40:46 26 4
gpt4 key购买 nike

我正在创建一个在无限循环上生成随机数的 Haskell 应用程序(仅在客户端请求时)。但是,我应该只为此目的使用纯函数。包装是否安全 randomIOunsafeperformIO没有任何剧烈的稳定性或性能风险?

最佳答案

任何使用 unsafePerformIO应该通过证明结果值仍然是纯的来证明是合理的。证明的严谨性取决于您和工作的重要性。例如,这种可悲的使用 unsafePerformIOrandomIO应该是安全的,因为你可以证明当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

以下对全局变量(可能是随机变量)的诱人定义并不安全:
rand :: Bool -> Int
rand True = unsafePerformIO randomIO
rand False = 0

问题是同一个表达式现在会产生不同的值:
main = do
print (rand True)
print (rand True)

在这里打印:
-7203223557365007318
-7726744474749938542

(至少在没有优化的情况下编译时——但这只是强调了不恰当使用 unsafePerformIO 的脆弱性)。

关于haskell - 在 randomIO 上使用 unsafeperformIO 的风险,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16208249/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com