2012-01-27 2 views
2

RandomGen -reliant 함수의 테스트 용으로, 테스트 된 함수의 결과를 올바른 값과 비교할 수 있도록 인스턴스화시에 숫자를 반환하는 RandomGen 인스턴스가 필요합니다. 나는. random에 대한 각 호출에서이 함수는 목록에서 다음 숫자를 반환하려고합니다. [5, 8, 2, 6, 6] (끝에 도달하거나 반복 될 수있는 경우 오류가 발생할 수 있음) 생성기의 인스턴스가 StaticGen [5, 8, 2, 6, 6]처럼 간단하게 생성 될 것으로 기대합니다.정적 (가짜) 랜덤 생성기

그런 라이브러리가 있는지 궁금하거나 테스트 할 때 다른 접근 방식을 사용해야하는 경우도 있습니다.

업데이트시 : 원래 random 대신 next 함수를 지정하여 질문에서 잘못 표시된 것으로 밝혀졌습니다. 목록에서 값을 반환하고 싶습니다. 내 사과.

+1

예를 들면. –

+0

@DanielFischer 그래,하지만 제네레이터에 의해 실제로 반환 된 값은 코드에서 분명하지 않을 것입니다. 이것은 분명히 제 경우의 요구 사항입니다. –

+0

값이 코드에서 분명해야하는 경우 실제로 작동하지 않습니다. 호기심에서 : 그들은 왜 분명해야합니까? –

답변

5

글쎄, 당신은 그러한 라이브러리를 배포 할 수 있습니다. 그러나 그것은 매우 짧을 것이다.

newtype StaticGen = StaticGen [Int] 
instance RandomGen StaticGen where 
    next (StaticGen (x:xs)) = (x, StaticGen xs) 
    next _ = error "No more random numbers!" 
    split x = (x, x)   -- broken, but irrelevant 
    genRange _ = (0, maxBound) -- choose your own 
언급 한 바와 같이

음,이 당신은 당신의 기능을 다시 쓸 수있는 당신이 밖으로 당신이 전달 순서를 제공, 그래서 대신에이 같은 난수 생성기를 복용하지 않습니다.

myFunction :: RandomGen g => g -> a -> (b, g) 

그들은 일

myFunction :: forall g. (g -> (Int, g)) -> g -> a -> (b, g) 

당신이 난수 생성기를 사용할 수있는 방법 :

대신이 같은

또는 당신은 목록을 사용할 수 있습니다 : 어쩌면 StdGen`는 사용자의 요구에 맞게 것`고정`staticGen = mkStdGen 13`와 테스트, 새로운`RandomGen` 인스턴스를 생성하는 대신

myFunction (\(x:xs) -> (x, xs)) [1,2,3,4] a 
+0

감사! 내 impl에서 나는'genRange'와'split' 함수를'split _ = error "Unsupported"와 같이 재갈을 물었다. 그러나 내가 질문을 잘못했다는 것이 드러났습니다. 실제로 필요한 것은'next' 호출이 아닌'random' 호출이 원하는 값을 반환하는 생성기입니다. 내 사과. 'System.Random' 소스를 분석 한 결과,이를 달성하기 위해 로그와 루프를 사용하여 계산 된 함수 randomIvalInteger의 값을 반대로해야합니다. 리버스 엔지니어링이 악몽으로 판명 났기 때문에 모든 것이 효과가 없다고 생각합니다. –

+0

답변을 업데이트했지만 기능의 서명을 변경해야합니다. –