假设我有一个记录类型:惯用的方式来收缩纪录快速检查
data Foo = Foo {x, y, z :: Integer}
写一个任意实例的一个巧妙的办法使用Control.Applicative这样的:
instance Arbitrary Foo where
arbitrary = Foo <$> arbitrary <*> arbitrary <*> arbitrary
shrink f = Foo <$> shrink (x f) <*> shrink (y f) <*> shrink (z f)
名单Foo的收缩因此是其成员所有缩小的笛卡尔积。
但是,如果其中一个收缩返回[],那么整个Foo将不会收缩。所以这是行不通的。
我可以尝试通过在收缩列表中的原始值将其保存:
shrink f = Foo <$> ((x f) : shrink (x f)) <*> ... {and so on}.
但现在萎缩(美孚0 0 0)将返回[美孚0 0 0],这意味着收缩永远终止。所以这也行不通。
它看起来应该有其他的东西< *>在这里使用,但我看不到什么。
我认为你的第一个答案解决了眼前的问题,谢谢。此外,像你的第二个可以做的就是添加到QuickCheck –