我通过阅读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?
-
答案 0 :(得分:4)
请参阅https://github.com/rickynils/scalacheck/commit/2d92eb61a89a8ec2e16d0af8599f9baafc9b5418
基本上,这是ScalaCheck测试用例简化所需要的,以了解生成的值最初具有的界限。