문제

유형 클래스가 있습니다 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) 전체 함수 범위에 대해서는 이미 세 가지를 제공합니다.

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