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)

mapxs から要素を選択するため、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、大文字と小文字から選択されたリストで構成されます。suchThatisLetter をもう一度チェックする必要があるのはなぜですか?

--

4

1 に答える 1

4

https://github.com/rickynils/scalacheck/commit/2d92eb61a89a8ec2e16d0af8599f9baafc9b5418を参照してください。

基本的に、生成された値が元々持っていた境界を知るために、ScalaCheck テスト ケースの単純化に必要です。

于 2014-06-28T15:26:59.077 に答える