Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 如何使用MonadRandom?_Haskell - Fatal编程技术网

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。我使用的是
Randmonad。
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