簡體   English   中英

為什么使用多態簽名的此QuickCheck測試在失敗時會通過?

[英]Why does this QuickCheck test with a polymorphic signature pass when it should fail?

給定以下使用prop_Max errMax測試代碼,我希望prop_Max errMax應該失敗,因為errMax的定義不正確。

當我對具體類型Int使用prop_Max的給定簽名時, prop_Max發生這種情況。 但是,當我使用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)

問題出在默認值上

默認情況下,在ghciExtendedDefaultRules名處於打開狀態。 這意味着,與一般Ord基類型簽名時, a類型變量被默認為()的類型。

由於類型()的唯一有效值是值() ,因此即使對於max的定義,測試也可以通過,而對於更復雜的類型, max的定義是不正確的。

對於QuickCheck測試,通常應該明確說明希望測試運行的類型。 因此,在這里您可以保留prop_Max的多態簽名,但是在調用quickCheck時顯式選擇Int

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM