Scalacheck:生成与生成器列表对应的列表

dip*_*ips 7 scala scalacheck

我想生成一个与生成器列表对应的整数列表ScalaCheck.

    import org.scalacheck._
    import Arbitrary.arbitrary

    val smallInt = Gen.choose(0,10)
    val bigInt = Gen.choose(1000, 1000000)
    val zeroOrOneInt = Gen.choose(0, 1)
    val smallEvenInt = smallInt suchThat (_ % 2 == 0)

    val gens = List(smallInt, bigInt, zeroOrOneInt, smallEvenInt)
    //val listGen: Gen[Int] = ??
    //println(listGen.sample) //should print something like List(2, 2000, 0, 6)
Run Code Online (Sandbox Code Playgroud)

对于给定的gens,我想创建一个listGen有效样本的生成器List(2, 2000, 0, 6).这是我第一次尝试使用元组.

    val gensTuple = (smallInt, bigInt, zeroOrOneInt, smallEvenInt)
    val tupleGen = for {
        a <- gensTuple._1
        b <- gensTuple._2
        c <- gensTuple._3
        d <- gensTuple._4
    } yield (a, b, c, d)

    println(tupleGen.sample) // prints Some((1,318091,0,6))
Run Code Online (Sandbox Code Playgroud)

这是有效的,但我不想使用元组,因为generator(gens)列表是动态创建的,并且列表的大小不固定.有没有办法与列表一起做?

我想listGen在scalacheck forAll属性检查中使用list()的生成器.

这看起来像玩具问题,但这是我能够创建一个独立的片段,再现我面临的实际问题.

Eri*_*ric 10

怎么用这个Gen.sequence方法?它将变换Iterable[Gen[T]]为a Gen[C[T]],其中C可以是List:

  def sequence[C[_],T](gs: Iterable[Gen[T]])(implicit b: Buildable[T,C]): Gen[C[T]] = 
     ...
Run Code Online (Sandbox Code Playgroud)

  • 工作良好!由于与另一个方法的歧义,我不得不显式添加隐式参数.`val listGen = Gen.sequence(gens)(util.Buildable.buildableList)` (2认同)