aboutsummaryrefslogtreecommitdiff
path: root/ch14/14_a_1.hs
diff options
context:
space:
mode:
authorJan Sucan <jan@jansucan.com>2024-03-12 17:21:06 +0100
committerJan Sucan <jan@jansucan.com>2024-03-12 17:21:06 +0100
commit781f6a0eb8e62b5f9c37228eff49b2f84284aa8e (patch)
tree64fe5b93a1bb4ecbb83edacaf95748ce4f8c4d17 /ch14/14_a_1.hs
parent70ac59a6845f54798a03924d498711503534fc55 (diff)
14_a_1: Add solution
Diffstat (limited to 'ch14/14_a_1.hs')
-rw-r--r--ch14/14_a_1.hs33
1 files changed, 33 insertions, 0 deletions
diff --git a/ch14/14_a_1.hs b/ch14/14_a_1.hs
new file mode 100644
index 0000000..6768583
--- /dev/null
+++ b/ch14/14_a_1.hs
@@ -0,0 +1,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