여러 유형에 대한 QuickCheck 속성 테스트?
-
11-09-2019 - |
문제
유형 클래스가 있습니다 Atomic
, 특정 유형을 래퍼 값으로/에서 변환하기위한 함수를 정의합니다 (Atom
). "모든 사례에 대해 다음과 같은 빠른 체크 속성을 정의하고 싶습니다. Atomic
, 모든 값은 안전하게 저장되고 검색 될 수 있습니다. "속성은 다음과 같습니다.
class Atomic a where
toAtom :: a -> Atom
fromAtom :: Atom -> Maybe a
prop_AtomIdentity x = fromAtom (toAtom x) == Just x
그러나 QuickCheck을 통해 해당 속성을 실행하려고하면 한 인스턴스를 선택합니다 (Bool
) 그리고 그것을 테스트합니다. 나는 현재 테스트 목록에서 지원되는 각 원자 유형에 대한 유형 서명을 정의하여이를 해결하고 있지만, 이것은 장황하고 오류가 발생하기 쉽습니다.
containerTests =
[ run (prop_AtomIdentity :: Bool -> Bool)
, run (prop_AtomIdentity :: Word8 -> Bool)
, run (prop_AtomIdentity :: String -> Bool)
{- etc -} ]
나는 이것을 자동으로 수행 할 함수를 정의하려고합니다.
forallAtoms :: (Atomic a, Show a) => (a -> Bool) -> [TestOptions -> IO TestResult]
forallAtoms x =
[ run (x :: Bool -> Bool)
, run (x :: Word8 -> Bool)
, run (x :: String -> Bool)
{- etc -} ]
containerTests = forallAtoms prop_AtomIdentity
그러나 타이 테크 오류로 실패합니다.
Tests/Containers.hs:33:0:
Couldn't match expected type `Word8' against inferred type `String'
In the first argument of `run', namely `(x :: Word8 -> Bool)'
In the expression: run (x :: Word8 -> Bool)
In the expression:
[run (x :: Bool -> Bool), run (x :: Word8 -> Bool),
run (x :: String -> Bool)]
여러 유형에 대해 QC 속성을 테스트하는 더 좋은 방법이 있습니까? 그렇지 않다면, 알라 톰을 위해 일을 할 수 있습니까? 아니면 유형 시스템에서 지원하지 않습니까?
해결책
코드를 컴파일 할 수 없으므로 ... 블라인드 샷 :
노력하다
forallAtoms :: (forall a. (Atomic a, Show a) => a -> Bool) -> [TestOptions -> IO TestResult]
유형 서명으로. 이것은 -xrankntypes 언어 확장이 필요합니다.
내가 보았 듯이 당신이 가진 문제는 GHC가 찾으려고한다는 것입니다. 하나 삽입하려면 입력하십시오 a
안에 x :: (a -> Bool)
전체 함수 범위에 대해서는 이미 세 가지를 제공합니다.
제휴하지 않습니다 StackOverflow