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