我需要生成一个从1到5的随机数,它不在传递的列表中.
这是我的代码:
questionNumberGenerator:: [Int]->Int
questionNumberGenerator ql = do
g <- newStdGen
let qn=(fst((randomR (1, 5) g)))::Int
let element = (elem qn ql)::Bool
if(element==True)
then
questionNumberGenerator ql
else do
return qn
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
问题是你的类型签名; 它应该是:
questionNumberGenerator :: [Int] -> IO Int
Run Code Online (Sandbox Code Playgroud)
questionNumberGenerator 返回一个IO动作(它必须使用全局随机数生成器),但你的类型签名表明它是纯粹的.
如果你想questionNumberGenerator在纯代码中使用,你必须明确地线程化随机数生成器状态,如下所示:
questionNumberGenerator :: (RandomGen g) => [Int] -> g -> (Int, g)
questionNumberGenerator ql g =
let (qn, g') = randomR (1, 5) g
element = elem qn ql
in if (element==True)
then questionNumberGenerator ql g'
else (qn, g')
Run Code Online (Sandbox Code Playgroud)
顺便说一句,(element==True)是多余的; element意思是完全一样的.
| 归档时间: |
|
| 查看次数: |
280 次 |
| 最近记录: |