aboutsummaryrefslogtreecommitdiff
path: root/ch14/14_a_1.hs
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