![](/img/trans.png)
[英]Why does QuickCheck take a long time when testing a Functor instance with a specific type signature?
[英]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)
問題出在默認值上 。
默認情況下,在ghci
, ExtendedDefaultRules
名處於打開狀態。 這意味着,與一般Ord
基類型簽名時, a
類型變量被默認為()
的類型。
由於類型()
的唯一有效值是值()
,因此即使對於max
的定義,測試也可以通過,而對於更復雜的類型, max
的定義是不正確的。
對於QuickCheck測試,通常應該明確說明希望測試運行的類型。 因此,在這里您可以保留prop_Max
的多態簽名,但是在調用quickCheck
時顯式選擇Int
:
quickCheck (prop_Max (errMax :: Int -> Int -> Int))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.