Załóżmy, że mam typ rekordu:Idiomatic sposób, aby zmniejszyć rekord w QuickCheck
data Foo = Foo {x, y, z :: Integer}
Zgrabny sposób pisania arbitralne wystąpienie używa Control.Applicative tak:
instance Arbitrary Foo where
arbitrary = Foo <$> arbitrary <*> arbitrary <*> arbitrary
shrink f = Foo <$> shrink (x f) <*> shrink (y f) <*> shrink (z f)
lista kurczenie się Foo jest więc produktem kartezjańskim wszystkich kurczących się członków.
Ale jeśli jeden z tych kurczy się zwróci [], nie będzie żadnych kurczących się Foo jako całości. To nie działa.
mógłbym spróbować zapisać go w tym oryginalną wartość na liście skurczowej:
shrink f = Foo <$> ((x f) : shrink (x f)) <*> ... {and so on}.
Ale teraz kurczyć (Foo 0 0 0) zwróci [Foo 0 0 0], co oznacza, że kurczenie nigdy nie będzie zakończyć. To też nie działa.
Wygląda na to, że powinno być tutaj coś innego niż < *>, ale nie widzę co.
Myślę, że twoja pierwsza odpowiedź rozwiązuje natychmiastowy problem, dzięki. Poza tym coś podobnego do twojego drugiego może zrobić z dodaniem do QuickCheck –