QuickCheck로 Int 목록 목록을 생성합니다
-
18-09-2019 - |
문제
나는 일하고있다 현실 세계 하스켈 4 장의 연습 중 하나는 foldr
기반 버전concat
. 나는 이것이 내 결과를 검증하기위한 기존 구현이 있기 때문에 QuickCheck으로 테스트하기위한 훌륭한 후보라고 생각했습니다. 그러나 이것은 내가 인스턴스를 정의해야합니다.Arbitrary
임의의 생성을 생성 할 수있는 타입 클래스 [[Int]]
. 지금까지 나는 이것을하는 방법을 알아낼 수 없었습니다. 첫 번째 시도는 다음과 같습니다.
module FoldExcercises_Test
where
import Test.QuickCheck
import Test.QuickCheck.Batch
import FoldExcercises
prop_concat xs =
concat xs == fconcat xs
where types = xs ::[[Int]]
options = TestOptions { no_of_tests = 200
, length_of_tests = 1
, debug_tests = True }
allChecks = [
run (prop_concat)
]
main = do
runTests "simple" options allChecks
이로 인해 테스트가 수행되지 않습니다. 다양한 비트와 조각을보고 Arbitrary
인스턴스 선언이 필요하고 추가되었습니다
instance Arbitrary a => Arbitrary [[a]] where
arbitrary = sized arb'
where arb' n = vector n (arbitrary :: Gen a)
이로 인해 GHCI는 인스턴스 선언이 유효하지 않으며 -xflexibleInstances를 추가하면 내 문제를 해결할 수 있다고 불평했습니다. 추가 {-# OPTIONS_GHC -XFlexibleInstances #-}
지침은 유형 불일치 및 중첩 인스턴스 경고를 초래합니다.
그래서 제 질문은이 작업을 수행하는 데 필요한 것이 무엇입니까? 나는 분명히 Haskell을 처음 접했고 나를 도와 줄 자원을 찾지 못하고 있습니다. 모든 포인터는 대단히 감사합니다.
편집하다
테스트 첫 번째 방식으로 QuickCheck의 출력에 의해 잘못 인도 된 것 같습니다. fconcat
정의됩니다
fconcat = undefined
실제로 기능을 올바르게 구현하면 실제로 예상 결과가 나타납니다. 도프!
해결책
[[Int]]
이미입니다 Arbitrary
인스턴스 (때문입니다 Int
이다 Arbitrary
예, 그렇습니다 [a]
모든 a
그 자체의 인스턴스 Arbitrary
). 그래서 그것은 문제가 아닙니다.
나는 당신의 코드를 직접 실행했습니다 (교체 import FoldExcercises
~와 함께 fconcat = concat
) 그리고 예상대로 200 번의 테스트를 실시 했으므로 왜 당신을 위해 그것을하지 않는지에 대해 신비화되었습니다. 그러나 추가 할 필요는 없습니다 Arbitrary
사례.