From 781f6a0eb8e62b5f9c37228eff49b2f84284aa8e Mon Sep 17 00:00:00 2001 From: Jan Sucan Date: Tue, 12 Mar 2024 17:21:06 +0100 Subject: 14_a_1: Add solution --- ch14/14_a_1.hs | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 ch14/14_a_1.hs (limited to 'ch14/14_a_1.hs') 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 -- cgit v1.2.3