nehme ich einen Plattentyp haben:Idiomatic Weg, um einen Datensatz in Quick schrumpfen
data Foo = Foo {x, y, z :: Integer}
Eine saubere Art und Weise, eine beliebige Instanz des Schreibens verwendet Control.Applicative wie folgt aus:
instance Arbitrary Foo where
arbitrary = Foo <$> arbitrary <*> arbitrary <*> arbitrary
shrink f = Foo <$> shrink (x f) <*> shrink (y f) <*> shrink (z f)
Die Liste der Schrumpfung für ein Foo ist also das kartesische Produkt aller Schrumpfe seiner Mitglieder.
Aber wenn eine dieser Schrumpfungen zurückkehrt [], dann wird es keine Schrumpfungen für die Foo als Ganzes geben. Das funktioniert also nicht.
Ich versuche, es zu speichern konnte den ursprünglichen Wert in der Schrumpf Liste einschließlich:
shrink f = Foo <$> ((x f) : shrink (x f)) <*> ... {and so on}.
Aber jetzt schrumpfen (Foo 0 0 0) zurückkehren [Foo 0 0 0], was bedeutet, dass Schrumpfen wird nie beenden. Das funktioniert auch nicht.
Es sieht so aus, als sollte etwas anderes als < *> hier verwendet werden, aber ich kann nicht sehen was.
Ich denke, Ihre erste Antwort löst das unmittelbare Problem, danke. Auch etwas wie Ihre zweite könnte mit QuickCheck hinzugefügt werden –