2014-11-02 6 views
4

Есть ли способ, чтобы фальсифицировать это свойство (неправильно):Haskell, QuickCheck, фальсифицировать свойство (неправильно):

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

Когда я использую QuickCheck, а затем VerboseCheck это дает 100 различных форм:

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

Passed:
и конечный результат:

+++ 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]