3

我通过阅读 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?

--

4

1 回答 1

4

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

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

于 2014-06-28T15:26:59.077 回答