2012-02-05 16 views
0

渡されたリストにない乱数を1から5まで生成する必要があります。ここでハスケル型エラー:タイプ: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はまったく同じことを意味します。