2014-10-04 8 views
2

QuickCheck를 사용하여 다음 테스트 코드가 주어진다면 prop_Max errMaxerrMax의 정의가 잘못되어 실패해야합니다.다형 서명이있는이 빠른 검사가 실패해야하는 이유는 무엇입니까?

prop_Max의 주어진 서명을 콘크리트 유형 Int과 함께 사용하면 이런 일이 발생합니다. 그러나 Ord을 사용하여 더 많은 다형 주석 처리 된 유형을 제공하면 테스트가 통과됩니다. 왜 이런거야?

import Test.QuickCheck 

myMax :: Ord a => a -> a -> a 
myMax x y 
    |x > y = x 
    |otherwise = y 

errMax :: Ord a => a -> a -> a 
errMax x y 
    |x > y = y 
    |otherwise = x 


-- prop_Max :: Ord a => (a -> a -> a) -> a -> a -> Bool 
prop_Max :: (Int -> Int -> Int) -> Int -> Int -> Bool 
prop_Max maxFunc x y = (x <= maxFunc x y) && (y <= maxFunc x y) 

-- in ghci 
-- quickCheck (prop_Max max) 
-- quickCheck (prop_Max myMax) 
-- quickCheck (prop_Max errMax) 
+0

당신이 다른 서명을하려고하면 무슨 에러가 발생합니까? –

+0

@GaneshSittampalam,'prop_Max :: Ord a => (a-> a) -> a-> a-> Bool'을 사용하면 quickCheck (prop_Max errMax)가 테스트에 합격합니다 – Alaya

+0

그렇다면 문제? –

답변

4

문제는 을 디폴트로합니다.

ghci 기본적으로 ExtendedDefaultRules 확장 기능이 켜져 있습니다. 즉, 일반적인 Ord 기반 서명 유형의 경우 a 유형 변수의 기본값은 ()입니다.

() 유형의 유효한 값만이 () 값이므로 더 복잡한 유형의 경우 올바르지 않은 max의 정의에도 테스트가 통과됩니다.

QuickCheck 테스트에서는 일반적으로 테스트를 수행 할 것으로 예상되는 유형에 대해 명시해야합니다. 그래서 여기 당신은 prop_Max의 다형성 서명을 유지할 수 있지만, quickCheck를 호출 할 때 명시 적으로 Int를 선택

quickCheck (prop_Max (errMax :: Int -> Int -> Int))