【发布时间】:2009-07-13 18:46:58
【问题描述】:
我浏览了一些关于 State monad 的教程,我想我明白了。
import Data.Word
type LCGState = Word32
lcg :: LCGState -> (Integer, LCGState)
lcg s0 = (output, s1)
where s1 = 1103515245 * s0 + 12345
output = fromIntegral s1 * 2^16 `div` 2^32
getRandom :: State LCGState Integer
getRandom = get >>= \s0 -> let (x,s1) = lcg s0
in put s1 >> return x
好的,所以我可以使用 getRandom:
*Main> runState getRandom 0
(0,12345)
*Main> runState getRandom 0
(0,12345)
*Main> runState getRandom 1
(16838,1103527590)
但是每次调用时我仍然需要将种子传递给 PRNG。我知道 Haskell 实现中可用的 PRNG 不需要:
Prelude> :module Random
Prelude Random> randomRIO (1,6 :: Int)
(...) -- GHC prints some stuff here
6
Prelude Random> randomRIO (1,6 :: Int)
1
所以我可能误解了 State monad,因为我在大多数教程中都能看到 似乎不是“持久”状态,而只是线程状态的一种便捷方式。
所以...我怎样才能拥有自动初始化的状态(可能来自某些 使用时间和其他不太可预测的数据的函数),例如 Random 模块 有吗?
非常感谢!
【问题讨论】:
标签: haskell monads state-monad