Ответ 1
Я видел одно крупное продвижение в QuickCheck 2, я думаю, что это важно, как тестирование монадического кода, если не больше:
class Arbitrary a where
arbitrary :: Gen a
shrink :: a -> [a]
Это действительно удивительно. Метод усадки является необязательным, но если вы можете предоставить список "возможно пустых" сокращений вашего типа, тогда, когда QuickCheck обнаружит ошибку, он попытается свести ваши неисправные данные к минимуму, пытаясь сжать его, а затем повторно -Попробуй это. Он сокращает его, пока он терпит неудачу.
Небольшой образец, чтобы убедить вас, без сокращения:
FormulaPrim deparsing : *** Failed! Falsifiable (after 4 tests):
Poly (Polynome "p" [(CoeffRatio (26 % 25),PolyRest (CoeffRatio (129 % 40))),(CoeffInt 96,PolyRest (CoeffInt 11)),(CoeffInt 29,PolyRest (CoeffRatio (147 % 121))),(CoeffRatio (62 % 9),PolyRest (CoeffRatio (90 % 43))),(CoeffInt 56,PolyRest (CoeffInt 27))])
С помощью:
FormulaPrim deparsing : *** Failed! Falsifiable (after 2 tests and 3 shrinks):
Poly (Polynome "t" [(CoeffInt 14,PolyRest (CoeffInt 126))])
Более короткий пример отказа означает более быструю отладку: -)