blob: 67685832092c804105e7d359049bb05f956d4c00 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
-- Rewrite getRandom to use do notation.
import Control.Monad.State
import System.Random
type RandomState a = State StdGen a
getRandom :: Random a => RandomState a
getRandom =
get >>= \gen ->
let (val, gen') = random gen in
put gen' >>
return val
getRandomDo :: Random a => RandomState a
getRandomDo = do
gen <- get
let (val, gen') = random gen
put gen'
return val
-- ghci> :l 14_a_1.hs
-- [1 of 1] Compiling Main ( 14_a_1.hs, interpreted )
-- Ok, one module loaded.
-- ghci> runState getRandomDo (mkStdGen 1)
-- (-2241774542048937483,StdGen {unStdGen = SMGen 4999253871718377453 10451216379200822465})
-- ghci> (runState getRandom (mkStdGen 1)) == (runState getRandomDo (mkStdGen 234))
-- False
-- ghci> (runState getRandom (mkStdGen 1)) == (runState getRandomDo (mkStdGen 1))
-- True
|