我被困在生成一些正态分布的随机变量上。我正在使用mwc-random软件包。
在GHCI中,我可以这样做:
gen <- create
normal 0 1 gen
在我的机器上产生:
-0.8077385934202513
在我的程序中,我只想创建一次生成器,然后重复使用它为我的模拟生成许多随机值,所以我这样做了:
createGenerator :: PrimMonad m => m (Gen (PrimState m))
createGenerator = do
gen <- create
return gen
returnPRNG :: PrimMonad m => Int -> Int -> m Double
returnPRNG 0 1 = normal 0 1 createGenerator
但是我收到了一个错误:
Couldn't match type ‘PrimState m’ with ‘Gen (PrimState Gen)’
Expected type: Gen (PrimState m)
Actual type: Gen (Gen (PrimState Gen))
我可能不习惯这样做,所以在这方面的帮助也会很棒。
答案 0 :(得分:5)
如果您只想创建一次生成器,那么第一部分应该如下所示:
createGenerator :: PrimMonad m => m (Gen (PrimState m))
createGenerator = gen
...
main = do
...
myGen <- createGenerator
(注意你除了给gen
另一个名字以外什么都不做?)
然后你必须绕过发电机:
returnPRNG :: PrimMonad m => Double -> Double -> Gen (PrimState m) -> m Double
returnPRNG a b gen = normal a b gen
当然只是(再次只是另一个名字)
returnPRNG = normal
(请注意,您必须将Double
传递给normal
- 所以假设额外的参数真的是你必须使用的那些)
程序中的用法如下所示:
main = do
...
myGenen <- createGenerator
...
rndVal1 <- returnPRNG 0 1 myGen
rndVal2 <- returnPRNG 0 1 myGen
并且注意到它真的只是
main = do
...
myGen <- gen
...
rndVal1 <- normal 0 1 myGen
rndVal2 <- normal 0 1 myGen