我正在学习 QuickCheck >= 2.6 的诀窍,但我不明白什么是心理医生。从查看type signature缩小看起来更像是扩张!请照亮我:)
最佳答案
当 QuickCheck 发现违反属性的输入时,它会首先尝试查找也违反该属性的较小输入,以便向开发人员提供有关失败性质的更好信息。
“小”的含义当然取决于所讨论的数据类型;对于 QuickCheck 来说,它是来自 shrink
函数的任何内容。
最好在 QuickCheck session 中进行解释:
Prelude Test.QuickCheck> let prop l = all (/= 5) l Prelude Test.QuickCheck> quickCheck prop *** Failed! Falsifiable (after 10 tests and 2 shrinks): [5]
所以这里 QuickCheck 能够给出最小的反例,但从评论来看,它首先考虑了一个更大的列表,然后使用 shrink
缩小了它。为了更仔细地了解正在发生的情况,我们使用 verboseCheck
:
Prelude Test.QuickCheck> verboseCheck prop Passed: [] Passed: [0] Passed: [-2,1] Passed: [-2,2,-2] Passed: [-4] Failed: [-1,-2,5,4,2] *** Failed! Passed: [] Failed: [5,4,2] Passed: [] Passed: [4,2] Failed: [5,2] Passed: [] Passed: [2] Failed: [5] Passed: [] Passed: [0] Passed: [3] Passed: [4] Falsifiable (after 6 tests and 3 shrinks): [5]
QuickCheck 尝试几个命题成立的列表,然后找到[-1,-2,5,4,2]
。现在它通过尝试它的子列表来减少列表。您可以在 GHCi 中说服自己 shrink [-1,-2,5,4,2] == [[],[5,4,2],[-1,-2,2],.. .
第二个条目是第一个仍未通过测试的条目。然后 QuickCheck 继续并进一步缩小:shrink [5,4,2] == [[],[4,2],[5,2],...
,以及进一步 >收缩[5,2]
[[]、[2]、[5]、...
。最后,它尝试进一步缩小 [5]
,但没有 shrink [5] ==
[[],[0],[3],[4]]
命题失败,因此最终的计数示例为 [5]
。
关于haskell - 对于 Haskell 的 QuickCheck,什么是收缩?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16968549/