scala - ScalaCheck 中的这种用法

标签 scala scalacheck

我正在通过阅读 ScalaCheck 的代码来学习 Scala,并发现许多组合器的后缀是 suchThat .然而,在很多情况下,这样的事情看起来并不是很有必要。我想知道为什么它们是这样设计的。这是摘自 GitHub 的一些内容:

Example 1.

/** Picks a random value from a list */
def oneOf[T](xs: Seq[T]): Gen[T] =
    choose(0, xs.size-1).map(xs(_)).suchThat(xs.contains)
map从 xs 中选取一个元素,因此 xs.contains似乎多余。

——
Example 2.

def containerOfN[C[_],T](n: Int, g: Gen[T])
    (implicit evb: Buildable[T,C], evt: C[T] => Traversable[T]): Gen[C[T]] =
    sequence[C,T](Traversable.fill(n)(g)) suchThat { c =>
      c.size == n && c.forall(g.sieveCopy)
    }

为什么是 c.size == n需要,鉴于成功 sequence将返回 n 的长度?

——
Example 3.

/** Generates a string of alpha characters */
def alphaStr: Gen[String] =
    listOf(alphaChar).map(_.mkString).suchThat(_.forall(_.isLetter))

生成的字符串将由 alphaChar 的列表组成这是从大写和小写字母中选择的。为什么我们需要一个 suchThat再次检查isLetter?

——

最佳答案

https://github.com/rickynils/scalacheck/commit/2d92eb61a89a8ec2e16d0af8599f9baafc9b5418

基本上,这是 ScalaCheck 测试用例简化所需要的,以了解生成的值最初具有的界限。

关于scala - ScalaCheck 中的这种用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24301666/

相关文章:

scala - 如何在属性检查中为 forAll 方法指定检查次数

Scalacheck Prop 类型不匹配

scala - scala中的对象实例化变体

scala - 从基本抽象类构造子类

java - 与 Java 或其他非函数式语言相比,Scala 究竟如何利用更多的核心?

scala - 为什么我需要在从 java 枚举获取的 Scala 数组中显式调用 apply 方法?

java - 如何使用 Scala 生成器生成具有范围的日期?

scala - scalacheck 中生成器的大小

scala - 如何使用 None 类型约束专门化一个特征?