Как использовать MonadRandom?
Может ли кто-нибудь предоставить пример "для чайников", как использовать MonadRandom?
В настоящее время у меня есть код, который выполняет такие вещи, как передача переменной генератора полностью из основной функции:
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 ответа
Решение
В основном все лишнее g
параметры могут быть просто отброшены. Затем вы получаете случайные числа, используя функции из Control.Monad.Random (такие как getRandomR
). Вот ваш пример (я добавил несколько аргументов для его компиляции):
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
Вы просто запускаете что-то в RandT
монадный трансформатор с runRandT
или же evalRandT
и для чистых Rand
монада, с runRand
или же evalRand
:
main = do
g <- getStdGen
r = evalRand twoEliteNumbers g
putStrLn $ "Result is: " ++ show r
twoEliteNumbers :: (RandomGen g) => Rand g (Double, Double)
twoEliteNumbers = do
-- You can call other functions in the Rand monad
number1 <- eliteNumber
number2 <- eliteNumber
return $ (number1, number2)
eliteNumber :: (RandomGen g) => Rand g Double
eliteNumber = do
-- When you need random numbers, just call the getRandom* functions
randomNumber <- getRandomR (0.0, 1.0)
return $ randomNumber * 1337