Scalacheck,大小为 5 到 12 的列表生成器
Posted
技术标签:
【中文标题】Scalacheck,大小为 5 到 12 的列表生成器【英文标题】:Scalacheck, generator for lists between size 5 and 12 【发布时间】:2016-04-21 02:12:26 【问题描述】:我可以找到许多设置生成器最大大小的示例,但是如何生成介于最小和最大长度之间的列表?
【问题讨论】:
【参考方案1】:关于生成器的一个简洁属性是它们是可组合的,因此您可以使用listOfN
生成器简单地为您的列表长度组合一个生成器。
for
numElems <- Gen.choose(5, 12)
elems <- Gen.listOfN(numElems, elemGenerator)
yield elems
【讨论】:
你知道吗;这简直太优雅了!出于某种原因,库在处理大小时需要转换,例如:不支持最小大小的 Gen.resize(12,myGenerator)。您的示例更加灵活和有启发性。 组合生成器是一个你必须在头脑中翻转的开关,但是一旦你意识到它对于生成专门的对象实际上是多么强大。很高兴我能帮上忙! 使用 Gen.chooseNum 而不是 Gen.choose,因为 chooseNum 赋予了更大的权重来测试和生成最小值、最大值和特殊情况,例如 0(如果它们在范围内)。 这让我觉得不正确:listOfN
中的 N
被描述为 Generates a list with at most the given number of elements
...意思是无论 N
是 5 还是 12,您仍然可以获得以下列表3个元素。或者一个空列表,就此而言。
我没有看到相同的文档。在底层它使用buildableOfN
,如果容器强制元素唯一性(如集合或地图),它可以生成小于指定大小的容器。 List 不是这种情况,我找到的所有文档都指定生成的列表的长度恰好是指定的 N【参考方案2】:
我在这里唤醒了鬼魂,但万一有人来:
根据我对已接受答案的评论,该解决方案随机决定 5 到 12 之间的最大长度,但在这种情况下,生成列表的实际大小仍可能为 0(零)或低于 5 的任何值。
我认为以下内容符合 OP 的描述:
Gen
.listOfN(12, elemGenerator)
.suchThat(_.size >= 5)
如果有一个 API 可以方便地生成这个,或者说一个精确大小的列表,N
,那就太棒了。
【讨论】:
以上是关于Scalacheck,大小为 5 到 12 的列表生成器的主要内容,如果未能解决你的问题,请参考以下文章