如何使用MonadRandom?

时间:2012-02-13 19:34:09

标签: haskell

有人可以提供“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

由于

2 个答案:

答案 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)

您只需使用RandTrunRandTevalRandT monad转换器中运行某些内容,并使用Rand或{{1}运行纯runRand monad }}:

evalRand