2012-02-05 127 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表示完全一樣的東西。

相關問題