2012-02-05 111 views
0

我需要生成一个从1到5的随机数,它不在已传入列表中。Haskell类型错误:类型:a Int,不匹配:Int

这里是我的代码:

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 

我在做什么错?

回答

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表示完全一样的东西。

相关问题