2012-02-05 5 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은 똑같은 것을 의미합니다.

관련 문제