Haskell QuickCheck最小计数器示例

elm*_*elm 9 haskell quickcheck

考虑以下关于反向和++之间分布律的测试,

import Test.QuickCheck

test :: [Int] -> [Int] -> Bool
test xs ys = reverse (xs ++ ys) == reverse xs ++ reverse ys

test2 :: (Eq a) => [a] -> [a] -> Bool
test2 xs ys = reverse (xs ++ ys) == reverse xs ++ reverse ys
Run Code Online (Sandbox Code Playgroud)

注意列表Int

*Main> quickCheck test
*** Failed! Falsifiable (after 5 tests and 3 shrinks):    
[1]
[0]
Run Code Online (Sandbox Code Playgroud)

然而,测试等于物品的列表,

*Main> quickCheck test2
+++ OK, passed 100 tests.
Run Code Online (Sandbox Code Playgroud)

是什么让第二次测试通过?

更新在编译时main = quickCheck test2,模糊类型变量的后续错误提示问题(如答案中所描述的),

No instance for (Eq a0) arising from a use of `test2'
The type variable `a0' is ambiguous
Possible fix: add a type signature that fixes these type variable(s)
Run Code Online (Sandbox Code Playgroud)

Ørj*_*sen 14

当你真正评估时test2,GHCi必须选择一种类型a来使用.如果没有更多信息,GHCi的扩展默认规则将其默认为()违法,法律适用.


And*_*ács 13

> verboseCheck test2 

Passed:
[]
[]
Passed:
[]
[]
Passed:
[(),()]
[()]
Passed:
[(),(),()]
[()]
Passed:
[()]
[(),(),(),()]
...
Run Code Online (Sandbox Code Playgroud)

多态参数默认为(),当然所有这些值都相等.