簡體   English   中英

Scalacheck:生成與生成器列表對應的列表

[英]Scalacheck: Generate list corresponding to list of generators

我想生成一個與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)

對於給定的gens ,我想創建一個生成器listGen其有效樣本可以是List(2, 2000, 0, 6) 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))

這是有效的,但我不想使用元組,因為生成器( gens )列表是動態創建的,並且列表的大小不固定。 有沒有辦法與列表一起做?

我希望在scalacheck中使用list( listGen )的生成器進行forAll屬性檢查。

這看起來像玩具問題,但這是我能夠創建一個獨立的片段,再現我面臨的實際問題。

如何使用Gen.sequence方法? 它將Iterable[Gen[T]]轉換為Gen[C[T]] ,其中C可以是List

  def sequence[C[_],T](gs: Iterable[Gen[T]])(implicit b: Buildable[T,C]): Gen[C[T]] = 
     ...

編輯:請不要理會,這不回答提問者的問題


我還不能評論帖子,所以我不得不在這里冒險。 我假設函數'sample'適用於生成器

你不能做的任何理由:

gens map (t=>t.sample)

對於更理論的答案:您想要的方法是traverse ,這相當於sequence compose map盡管它可能更有效。 它是一般形式:

def traverse[C[_]: Traverse, F[_]: Applicative, A, B](f: A => F[B], t: C[A]): F[C[B]]

它的行為類似於map但允許您在遍歷期間攜帶一些額外的Applicative結構,並沿途對其進行排序。

只需使用Gen.sequence ,但要小心,因為它會嘗試返回java.util.ArrayList[T]如果你沒有完全參數化它( bug )。

完整的工作示例:

def genIntList(): Gen[List[Int]] = {

  val gens = List(Gen.chooseNum(1, 2), Gen.chooseNum(3, 4))

  Gen.sequence[List[Int], Int](gens)
}

println(genIntList.sample.get) // prints: List(1,4)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM