Haskell 如何使用MonadRandom?
有人能提供一个如何使用“蒙娜多姆”的“傻瓜”例子吗 目前,我有一些代码可以传递生成器变量,从主函数开始:Haskell 如何使用MonadRandom?,haskell,Haskell,有人能提供一个如何使用“蒙娜多姆”的“傻瓜”例子吗 目前,我有一些代码可以传递生成器变量,从主函数开始: 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 = cf
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
main=do
g您只需使用runRandT
或evalRandT
在RandT
monad转换器中运行一些东西,对于纯Rand
monad,使用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
main=do
g兰德g(双人,双人)
twoEliteNumbers=do
--您可以调用Rand monad中的其他函数
数字1基本上所有额外的g
参数都可以删除。然后使用函数(如getRandomR
)获取随机数。以下是您的示例(我添加了一些参数以使其可编译):
import Control.Monad.Random
main=do
我想你把runRand
和evalRand
搞混了!不确定是怎么发生的,因为我运行了代码:)现在已修复。当然,myFunc
、aFunc
、bFunc
和cFunc
现在是一元的。它们返回包装在Rand
monad中的值,必须使用>=
(或者No,你可以在任何地方使用它们。你只需要使用evalRand
或runRand
和RandGen
参数。基本上,你已经从必须显式传递参数变为“免费”传递参数,但在monad中工作。这样也更难出错(比如忘记传递由randomR
返回的第二个参数).记住,monadic并不意味着IO
monad。在本例中,我们讨论的是Rand
monad。它确保生成器正确地遍历代码,因此您不会无意中从生成器的相同状态创建两个随机数(这将生成两个相同的所谓随机数)。在您的示例中,您正在丢弃新的生成器。如果您想创建第二个随机数,您可能会再次尝试使用g
,但这是不正确的。此外……如果我不是从main调用func
会发生什么?do
并不意味着您使用IO
monad。我使用的是Rand这里是code>monad。func
可以从Rand
monad中的任何其他函数调用。我将用一个示例进行更新。
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