2014-11-02 32 views
4

有沒有一種方法來僞造這個(錯誤)物業:哈斯克爾,快速檢查,竄改(錯誤)物業:

prop :: Eq a => [a] -> Bool 
prop xs = reverse xs == xs 

當我使用快速檢查,後來VerboseCheck它給了100種不同的形式:

[(),(),(),(),(),(),(),(),(),(),(),(),(),(),()] 

通過:
和最後的結果是:

+++ OK, passed 100 tests. 

回答

10

這只是恰巧

  1. 如果試圖以評估在GHCI,它有選擇的Eq a特定實例類型使用,並與ExtendedDefaultRules擴展在GHCI正常啓用,它選擇()
  2. 對於()類型,由於它只有一個(非底部)值,所以命題實際上是true

最簡單的解決方法是通過提供一種類型的註釋來選擇(幾乎)的任何其他類型:

Prelude Test.QuickCheck> quickCheck (prop :: [Int] -> Bool) 
*** Failed! Falsifiable (after 4 tests and 3 shrinks): 
[0,1]