Как использовать MonadRandom? - PullRequest
12 голосов
/ 13 февраля 2012

Может ли кто-нибудь предоставить пример «для чайников», как использовать `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 ]

15 голосов
/ 13 февраля 2012

По сути, все дополнительные 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
8 голосов
/ 13 февраля 2012

Вы просто запускаете что-то в 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...