从生成器列表创建生成器
Create generator from list of generators
我想从多个生成器创建生成器。
我有生成器列表
val generators: List[Gen] = List(Gen[Int], Gen[Double], Gen[String], ...)
我不知道列表的大小,它可以是任何大小
我想创建这样的东西:
val listGen: Gen[List[Any]] = createListGenerator(generators)
如果您希望 listGen
以任意顺序为您提供从 generators
中的一个或多个生成器中提取的任意数量的元素,您可以执行以下操作:
// 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)
我们从生成器列表开始
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
生成。将以任意顺序包含任意数量的整数、双精度数和字符串。
我想从多个生成器创建生成器。 我有生成器列表
val generators: List[Gen] = List(Gen[Int], Gen[Double], Gen[String], ...)
我不知道列表的大小,它可以是任何大小
我想创建这样的东西:
val listGen: Gen[List[Any]] = createListGenerator(generators)
如果您希望 listGen
以任意顺序为您提供从 generators
中的一个或多个生成器中提取的任意数量的元素,您可以执行以下操作:
// 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)
我们从生成器列表开始
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
生成。将以任意顺序包含任意数量的整数、双精度数和字符串。