レコードタイプがあるとします:
data Foo = Foo {x, y, z :: Integer}
Arbitrary インスタンスを適切に記述するには、次のように Control.Applicative を使用します。
instance Arbitrary Foo where
arbitrary = Foo <$> arbitrary <*> arbitrary <*> arbitrary
shrink f = Foo <$> shrink (x f) <*> shrink (y f) <*> shrink (z f)
したがって、Foo のシュリンクのリストは、そのメンバーのすべてのシュリンクのデカルト積です。
しかし、これらの縮小の 1 つが [ ] を返す場合、Foo 全体の縮小はありません。したがって、これは機能しません。
縮小リストに元の値を含めることで、保存してみることができます。
shrink f = Foo <$> ((x f) : shrink (x f)) <*> ... {and so on}.
しかし今は、shrink (Foo 0 0 0) は [Foo 0 0 0] を返します。これは、縮小が決して終了しないことを意味します。だからそれもうまくいきません。
ここで使用されている <*> 以外の何かがあるはずですが、何がわかりません。