Skip to content

Commit 9ee79a7

Browse files
authored
StdGen: constructor accessible via Internal only (#123)
Fixes haskell#59 by making 'StdGen' not an instance of 'Read'.
1 parent f2319cc commit 9ee79a7

4 files changed

Lines changed: 12 additions & 10 deletions

File tree

System/Random.hs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -293,7 +293,7 @@ getStdGen :: MonadIO m => m StdGen
293293
getStdGen = liftIO $ readIORef theStdGen
294294

295295
theStdGen :: IORef StdGen
296-
theStdGen = unsafePerformIO $ SM.initSMGen >>= newIORef
296+
theStdGen = unsafePerformIO $ SM.initSMGen >>= newIORef . StdGen
297297
{-# NOINLINE theStdGen #-}
298298

299299
-- |Applies 'split' to the current global pseudo-random generator,

System/Random/Internal.hs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
{-# LANGUAGE FlexibleInstances #-}
66
{-# LANGUAGE FunctionalDependencies #-}
77
{-# LANGUAGE GHCForeignImportPrim #-}
8+
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
89
{-# LANGUAGE MagicHash #-}
910
{-# LANGUAGE MultiParamTypeClasses #-}
1011
{-# LANGUAGE RankNTypes #-}
@@ -32,7 +33,7 @@ module System.Random.Internal
3233
, MonadRandom(..)
3334

3435
-- ** Standard pseudo-random number generator
35-
, StdGen
36+
, StdGen(..)
3637
, mkStdGen
3738

3839
-- * Monadic adapters for pure pseudo-random number generators
@@ -404,9 +405,10 @@ runStateGenST g action = runST $ runStateGenT g action
404405

405406

406407
-- | The standard pseudo-random number generator.
407-
type StdGen = SM.SMGen
408+
newtype StdGen = StdGen { unStdGen :: SM.SMGen }
409+
deriving (RandomGen, Show)
408410

409-
instance RandomGen StdGen where
411+
instance RandomGen SM.SMGen where
410412
next = SM.nextInt
411413
genWord32 = SM.nextWord32
412414
genWord64 = SM.nextWord64
@@ -420,7 +422,7 @@ instance RandomGen SM32.SMGen where
420422

421423
-- | Constructs a 'StdGen' deterministically.
422424
mkStdGen :: Int -> StdGen
423-
mkStdGen s = SM.mkSMGen $ fromIntegral s
425+
mkStdGen = StdGen . SM.mkSMGen . fromIntegral
424426

425427
-- | The class of types for which a uniformly distributed value can be drawn
426428
-- from all possible values of the type.

System/Random/Monad.hs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -211,7 +211,7 @@ instance RandomGen r => RandomGenM STGenM r s (ST s) where
211211
--
212212
-- >>> import Data.Int (Int8)
213213
-- >>> runGenM (IOGen (mkStdGen 217)) (`uniformListM` 5) :: IO ([Int8], IOGen StdGen)
214-
-- ([-74,37,-50,-2,3],IOGen {unIOGen = SMGen 4273268533320920145 15251669095119325999})
214+
-- ([-74,37,-50,-2,3],IOGen {unIOGen = StdGen {unStdGen = SMGen 4273268533320920145 15251669095119325999}})
215215
--
216216
-- @since 1.2
217217
runGenM :: MonadRandom g s m => Frozen g -> (g s -> m a) -> m (a, Frozen g)

bench/Main.hs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,10 @@ main = do
2222
let !sz = 100000
2323
defaultMain
2424
[ bgroup "baseline"
25-
[ let !stdGen = mkStdGen 1337 in bench "nextWord32" $ nf (genMany SM.nextWord32 stdGen) sz
26-
, let !stdGen = mkStdGen 1337 in bench "nextWord64" $ nf (genMany SM.nextWord64 stdGen) sz
27-
, let !stdGen = mkStdGen 1337 in bench "nextInt" $ nf (genMany SM.nextInt stdGen) sz
28-
, let !stdGen = mkStdGen 1337 in bench "split" $ nf (genMany SM.splitSMGen stdGen) sz
25+
[ let !smGen = SM.mkSMGen 1337 in bench "nextWord32" $ nf (genMany SM.nextWord32 smGen) sz
26+
, let !smGen = SM.mkSMGen 1337 in bench "nextWord64" $ nf (genMany SM.nextWord64 smGen) sz
27+
, let !smGen = SM.mkSMGen 1337 in bench "nextInt" $ nf (genMany SM.nextInt smGen) sz
28+
, let !smGen = SM.mkSMGen 1337 in bench "split" $ nf (genMany SM.splitSMGen smGen) sz
2929
]
3030
, bgroup "pure"
3131
[ bgroup "random"

0 commit comments

Comments
 (0)