我需要生成一个从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
我做错了什么?
答案 0 :(得分:6)
问题是你的签名;它应该是:
questionNumberGenerator :: [Int] -> IO Int
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')
顺便说一下,(element==True)
是多余的; element
表示完全相同的事情。