gpt4 book ai didi

scala - scalacheck 中生成器的大小

转载 作者:行者123 更新时间:2023-12-03 03:22:41 24 4
gpt4 key购买 nike

UserGuide scalacheck 项目提到了大小的生成器。解释代码

def matrix[T](g:Gen[T]):Gen[Seq[Seq[T]]] = Gen.sized {size =>
val side = scala.Math.sqrt(size).asInstanceOf[Int] //little change to prevent compile-time exception
Gen.vectorOf(side, Gen.vectorOf(side, g))
}

没有为我解释任何事情。经过一番探索后,我了解到生成序列的长度并不取决于生成器的实际大小(Gen 对象中有调整大小方法,根据 javadoc“创建生成器的调整大小版本”(也许这意味着不同的东西?))。

val g =  Gen.choose(1,5)
val g2 = Gen.resize(15, g)
println(matrix(g).sample) // (1)
println(matrix(g2).sample) // (2)
//1,2 produce Seq with same length

您能否解释一下我错过了什么,并给我一些如何在测试代码中使用它们的示例?

最佳答案

vectorOf(现在已替换为 listOf)生成的列表,其大小(线性)取决于 ScalaCheck 在评估生成器时设置的大小参数。当 ScalaCheck 测试属性时,它会为每次测试增加此大小参数,从而导致使用越来越大的列表来测试属性(如果使用 listOf)。

如果您仅通过以嵌套方式使用 listOf 生成器来创建矩阵生成器,您将获得大小取决于大小参数的平方的矩阵。因此,当在属性中使用此类生成器时,您可能会得到非常大的矩阵,因为 ScalaCheck 会增加每次测试运行的大小参数。但是,如果您按照 ScalaCheck 用户指南中的方式使用 resize 生成器组合器,您的最终矩阵大小将线性取决于大小参数,从而在测试属性时获得更好的性能。

您实际上不必经常使用resize生成器组合器。如果您需要生成受某个特定大小限制的列表,最好执行如下示例所示的操作,因为不能保证 listOf/containerOf生成器确实按照您期望的方式使用大小参数。

def genBoundedList(maxSize: Int, g: Gen[T]): Gen[List[T]] = {
Gen.choose(0, maxSize) flatMap { sz => Gen.listOfN(sz, g) }
}

关于scala - scalacheck 中生成器的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3666744/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com