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

时间:2012-02-05 15:34:07

标签: 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

我做错了什么?

1 个答案:

答案 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表示完全相同的事情。