Option [T] in ScalaCheck generieren

Ich versuche erfolglos, optionale Parameter in ScalaCheck zu generieren.

Es scheint keinen direkten Mechanismus dafür zu geben.Gen.containerOf[Option, Thing](thingGenerator) schlägt fehl, weil es ein implizites nicht finden kannBuildable[Thing, Option].

Ich habe es versucht

for {
  thing <- Gen.listOfN[Thing](1, thingGenerator)
} yield thing.headOption

Aber das funktioniert nicht, weillistOfN erzeugt eine Liste, die immer die Länge N hat. Als Ergebnis bekomme ich immer eineSome[Thing]. Ähnlich,listOf1 funktioniert nicht, weil (a) keine leeren Listen erzeugt werden, aber auch (b) es ineffizient ist, weil ich die maximale Anzahl der Elemente nicht festlegen kann.

Wie kann ich generierenOption[Thing] das schließt Nones ein?

BEARBEITEN: Ich habe eine Lösung gefunden, aber sie ist nicht prägnant. Gibt es einen besseren Weg als diesen?

for {
  thing <- for {
    qty <- Gen.choose(0,1)
    things <- Gen.listOfN[Thing](qty, thingGenerator)
  } yield things.headOption
} yield thing

BEARBEITEN 2: Ich verallgemeinerte dies zu

def optional[T](g: Gen[T]) = 
  for (qty <- Gen.choose(0, 1); xs <- Gen.listOfN[T](qty, g)) yield xs.headOption

Ich muss es also nicht mehr als einmal schreiben. Aber sicher ist das schon in der Bibliothek und ich habe es einfach verpasst?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage