FsCheck がいくつかの型のカスタマイズされたインスタンスを生成するように、いくつかのカスタム ジェネレーターを使用して型を定義しました。しかし、複雑なタイプの 1 つについては、最初にデフォルトの FsCheck 生成を使用してから、結果を調整したいと考えています。(簡略化された)コードは次のとおりです。
type CustomGenerators =
static member FirstCustomType() = /* function that returns FirstCustomType */
static member SecondCustomType() =
Arb.generate<SecondCustomType>
|> Gen.map (fun x -> /* adjust some data in the generated instance */)
|> Arb.fromGen
問題は、SecondCustomType() 静的メソッドが Arb.generate を呼び出すと、即座に SecondCustomType() が呼び出され、無限の再帰が発生することです。Arb.generate はカスタム ジェネレーターを尊重する必要があることを理解しています。これが静的な SecondCustomType() を呼び出す理由ですが、SecondCustomType のデフォルトの (カスタマイズされていない) Arb.generate 実装を呼び出す必要があります。私のカスタム ジェネレーターは FirstCustomType のカスタム ジェネレーターを使用するため、別の型から実装を呼び出すことはできません。これは一種の悪循環であり、明確な解決策がまだ見つかっていません (回避策のみ)。