일단 문자열을 선택하면 다시 반복 할 수 없도록 가능한 문자열 집합에서 문자열을 생성하는 문제를 고려하십시오. 이 작업을 위해 QuickCheck
의 Gen
기능을 사용하고 싶습니다.QuickCheck을 사용하여 문자열 풀에서 임의의 문자열 생성
필자가 작성하려고하는 함수의 유형을 살펴보면 상태 모나드와 매우 유사하게 보입니다. 다른 모나드 즉, Gen
을 상태 모나드에 사용하고 있습니다. 나는 StateT
을 사용하여 나의 첫번째 시도를 썼다. 이 구현에 대해 나를 괴롭게
newtype GenState = St {getStrings :: [String]}
deriving (Show)
removeString :: String -> GenState -> GenState
removeString str (St xs) = St $ delete str xs
stringGenS :: Gen (a, GenState) -> Gen (String, GenState)
stringGenS genStSt =
genStSt >>= \(_, st) ->
elements (getStrings st) >>= \str ->
return (str, removeString str st)
뭔가 내가 stringGenS
의 첫 번째 요소를 사용하지 않는 사실이다 :
arbitraryStringS :: StateT GenState Gen String
arbitraryStringS =
mapStateT stringGenS get
. 둘째, 최종 목표는 JSON 값에 대한 임의의 생성기를 정의하는 것입니다.이 생성기는 리소스 풀 (문자열뿐 아니라)을 사용합니다. StateT
를 사용하면 QuickCheck
의 elements
, listOf
등
내가 거기에 이것을 달성하는 더 좋은 방법, 또는 이러한 복잡성은 기존의 모나드의 상태 변종을 정의하는 고유인지 궁금 해서요의 "상태"변종을 구현하는 나를 이끌었다.
생성 된'Strings' 또는 최소한 시드를 저장하고 seed /'String'의'Set' 멤버십에 대한 각 시드/생성 된 문자열을 비교하는 방법을 사용합니다. – epsilonhalbe
다른 선택은 uuid를 사용하여 "가장 가능성있는"고유 문자열을 생성 할 수 있습니다. 문자열의 유한 집합 만있는 경우 - 결국 문자열이 부족하여 큰 기본 집합을 조합하여 해결할 수 있지만 여전히 실행됩니다. 중복 문자열에 - 당신이 "진정한 유일성"이 필요하다면 기본 세트 + 자연수와 같은 무한 집합을 가지고 결합 할 것입니다. – epsilonhalbe
문자열이 리소스 풀에서 오는 것이 중요합니다. 이것은 일부 데이터베이스에있는 데이터를 사용하여 테스트를 생성하는 데 사용할 수 있습니다. –