我想使用库System.Random.MWC生成范围(0,30)中的随机整数.我可以使用库System.Random来做到这一点:
import System.Environment
import System.IO.Unsafe
import System.Random
p :: Integer -> Integer
p n = unsafePerformIO (getStdRandom (randomR (0 , n)))
main :: IO()
main = do
print $! (p 30)}
Run Code Online (Sandbox Code Playgroud)
但我对System.Random.MWC感到困惑.
我想一个转换IO Int到Int从System.Random.MWC使用unsafePerformIO.它在ghci中有效:
Prelude System.Random.MWC System.IO.Unsafe> let p = unsafePerformIO(uniformR (0, 30) gen :: IO Int)
Prelude System.Random.MWC System.IO.Unsafe> p
11
Prelude System.Random.MWC System.IO.Unsafe> :t p
p :: Int
Run Code Online (Sandbox Code Playgroud)
但是在GHC
import System.Random.MWC
import System.IO.Unsafe
main :: IO()
main = do
gen <-createSystemRandom
print $! s 30 gen
s :: Int-> GenIO -> Int
s !k g = unsafePerformIO(uniformR (0, k - 1) g)
Run Code Online (Sandbox Code Playgroud)
它返回
ghc: panic! (the 'impossible' happened)
(GHC version 7.6.3 for …Run Code Online (Sandbox Code Playgroud)