2011-07-26 4 views
3

누구나 선택한 요소를 한 번만 선택하도록 QuickCheck를 사용하여 Haskell에서 발전기를 정의하는 방법을 정확히 알고 있습니까?Haskell QuickCheck Unique 난수 생성

나는 "Gen (May Positive)"생성기가 필요할 수도 있다는 것을 깨달았지만 물론 반복으로 숫자를 생성 할 것입니다. 선택한 번호를 반복하지 않고 선택하도록합니다. 예를 들어, 숫자가 반환 된 경우 방금 반환하고 원주민이 모두 소진 된 인스턴스에서 Gen Nothing이 반환되기를 원합니다.

감사합니다,

마크

답변

4

당신은 할 수 없습니다. definition of Gen을보십시오. 지금까지 선택된 것이 무엇인지에 대해 어떤 국가도 지킬 수있는 방법이 없습니다. 랜덤 생성자와 크기 제한이 동일한 경우 항상 동일한 결과를 생성해야합니다. 그러나 값을 반복 생성하는 Eq a => Gen [a] 작성하십시오. 단순한 (그러나 다소 순진한) 사람은 이와 같은 것입니다.

uniques :: Eq a => Gen a -> Gen [a] 
uniques gen = fmap nub $ listOf gen 
+2

xorshift 임의 생성기에는 의도적으로 반복이 없습니다. 너도해볼 수있어. (위의 문장은 처음 2^64 정도의 숫자를 유지합니다. – fuz

+0

Hrm. CoArbitrary를 사용하여 매번 다른 발전기를 선택하는 것이 가능할 것이라고 생각했습니다. (제한적으로/제한적으로) – Mark

0

이에 대한 permutations (모듈 Data.List에서) 사용할 수 있습니다. 당신이 볼 수 있듯이

permutations :: [a] -> [[a]]

, 그것은 목록의 목록을 반환 : 여기

permutations에 대한 함수 서명입니다.

> permutations [1..3]
[[1,2,3],[2,1,3],[3,2,1],[2,3,1],[3,1,2],[1,3,2]]

그래서 당신이 뭔가를 할 수 있습니다 : 여기 (GHCi 7.0.4을 사용하여) 약간의 예는 내가 그래서 약간의 마사지를해야 함을 테스트하지 않았습니다

prop_unique_elements = forAll (elements (permutations [1..3])) $ \x -> foo == bar

, 나는 그것이 그 요지를 분명히 전달하기를 바랍니다. 행운을 빕니다.

+0

나는 생각하지 않습니다. 당신이 생각하는대로 할 것입니다. – sclv

+0

@sclv 나는 그것이 무엇을한다고 생각 하는가? 나는 언제나 술어에 대한 생성자의 보편적 인 양을 선언한다고 생각했다 : 분명히 각 순열을 철저히 실행하지는 않지만, 생성기는 질문이 묻는 것처럼 고유 한 요소가있는 목록이됩니다. – Brandon

+0

그러면 우리는 질문에 대한 다른 해석을하고 있습니다 - 나는 철저한 테스트를 요구하는 것으로 읽습니다. 즉, 각 테스트에 대해 구별되는 요소 목록을 생성하는 생성기를 요구하는 것이 아니라 각 테스트마다 고유 한 요소를 선택하는 것입니다. 다른 테스트에서 같은 목록을 생성합니다. – sclv

3

빠른 검사는 일반적으로 철저한 테스트가 아닌 임의 테스트입니다. 을 수행하는 훌륭한 라이브러리가 있습니다.은 철저한 테스트를 처리합니다. smallchecklazysmallcheck을보십시오.