私は 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 をもう一度チェックする必要があるのはなぜですか?
--