Предположим, у меня есть тип записи:
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}.
Но теперь shrink (Foo 0 0 0) вернет [Foo 0 0 0], что означает, что сжатие никогда не прекратится. Так что это тоже не работает.
Похоже, что здесь должно быть что-то другое, кроме < * > , но я не вижу, что.