这样可以在ScalaCheck中使用

时间:2014-06-19 08:06:39

标签: 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?

-

1 个答案:

答案 0 :(得分:4)

请参阅https://github.com/rickynils/scalacheck/commit/2d92eb61a89a8ec2e16d0af8599f9baafc9b5418

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