Haskell类型错误:类型:一个Int,不匹配:Int

n00*_*00b 0 haskell typeerror

我需要生成一个从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)

我究竟做错了什么?

ehi*_*ird 6

问题是你的类型签名; 它应该是:

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意思是完全一样的.