15

レコードタイプがあるとします:

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] を返します。これは、縮小が決して終了しないことを意味します。だからそれもうまくいきません。

ここで使用されている <*> 以外の何かがあるはずですが、何がわかりません。

4

2 に答える 2