假設我有一個記錄類型:慣用的方式來收縮紀錄快速檢查
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 –