1

给定以下代码

rollDie :: GeneratorState Int
rollDie = do generator <- get
             let (value, newGenerator) = randomR (1,6) generator
             put newGenerator
             return value

我知道我可以将其翻译为:

rollDie2 :: GeneratorState Int
rollDie2 = get >>= \generator ->let (value, newGenerator) = randomR(1,6) generator
                                in put newGenerator >> return value

我测试了有和没有 的两个函数put newGenerator >>,它们产生了不同的结果。我的问题是为什么?put函数是纯函数,运算符 ( )>>表示return value不受先前结果的影响。

4

1 回答 1

1

当我用相同的初始状态测试这两个函数时,我得到了相同的答案:

λ> evalState rollDie (mkStdGen 0)
6
λ> evalState rollDie2 (mkStdGen 0)
6

我怀疑您在两个测试中都没有使用相同的状态。你究竟是如何测试这些功能的?

这是一个修改状态(即随机数生成器)的示例:

test :: GeneratorState (Int, Int)
test = do
  a <- rollDie -- modifies the state!
  b <- rollDie2 -- gets a different state
  return (a, b)

runTest :: IO ()
runTest = do
  g <- getStdGen
  let (a, b) = evalState test g
  print a
  print b

如您所见,当您运行此程序时,您会得到两个不同的答案。

λ> runTest
4
2
于 2013-07-11T16:39:41.723 回答