有人可以提供“for-dummies”如何使用“MonadRandom”的例子吗?
目前我的代码执行的方式就像传递生成器变量一样,从main函数开始:
main = do
g <- getStdGen
r <- myFunc g
putStrLn "Result is : " ++ show r
--my complicated func
myFunc g x y z = afunc g x y z
afunc g x y z = bfunc g x y
bfunc g x y = cfunc g x
cfunc g x = ret where
(ret, _ ) = randomR (0.0, 1.0) g
由于
答案 0 :(得分:15)
基本上所有额外的g
参数都可以删除。然后使用Control.Monad.Random中的函数(例如getRandomR
)获取随机数。这是你的例子(我添加了一些args以使其编译):
import Control.Monad.Random
main = do
g <- getStdGen
let r = evalRand (myFunc 1 2 3) g :: Double
-- or use runRand if you want to do more random stuff:
-- let (r,g') = runRand (myFunc 1 2 3) g :: (Double,StdGen)
putStrLn $ "Result is : " ++ show r
--my complicated func
myFunc x y z = afunc x y z
afunc x y z = bfunc x y
bfunc x y = cfunc x
cfunc x = do
ret <- getRandomR (0.0,1.0)
return ret
答案 1 :(得分:8)
您只需使用RandT
或runRandT
在evalRandT
monad转换器中运行某些内容,并使用Rand
或{{1}运行纯runRand
monad }}:
evalRand