문제

나는 일하고있다 현실 세계 하스켈 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 사례.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top