从生成器列表创建生成器

时间:2016-02-16 05:16:52

标签: scala scalacheck

我想从多个生成器创建Generator。 我有发电机列表

val generators: List[Gen] = List(Gen[Int], Gen[Double], Gen[String], ...)

我不知道列表的大小是多少,可以是任何大小

我想创建这样的东西:

val listGen: Gen[List[Any]] = createListGenerator(generators)

2 个答案:

答案 0 :(得分:1)

如果您希望listGengenerators中的一个或多个生成器从任意顺序为您提供任意数量的元素,您可以执行以下操作:

// Scala's type inference gets a bit finicky when combining Anys with CanBuildFroms
val comboGen = Gen.sequence[List[Any], Any](generators).flatMap(Gen.oneOf[Any])
val listGen = Gen.listOf(comboGen)

或者,如果您希望listGen生成完全相同数量的元素,因为generators中的元素和订单顺序相同,您只需执行

val listGen = Gen.sequence[List[Any], Any](generators)

答案 1 :(得分:0)

我们从生成器列表开始

val generators: List[Gen[Any]] = ???

接下来,我们创建一个生成器,通过选择一个生成器并生成该生成器生成的项来生成元素:

val genOne: Gen[Any] = for {
  gen <- Gen.oneOf(generators)
  item <- gen
} yield item

我们可以使用此生成器创建列表生成器

val listGen: Gen[List[Any]] = Gen.listOf(genOne)

此列表生成器生成一个列表(可能为空),该列表可以包含原始generators列表中的生成器生成的项目,但并非所有生成器都包含在内,并且顺序是随机的。

例如,如果generators列表包含Gen[Int]Gen[Double]Gen[String],则listGen生成的列表。将以任何顺序包含任意数量的整数,双精度数和字符串。