title: Why is my Scalacheck test with a custom Generator failing after discarding many cases, and how do I fix this?
body: <p>I am a newbie with Scala and I am writing my first Scalacheck suite.</p>
  
  <p>I have a data structure in my program that essentially looks like a <code>(List[Double], List[Double])</code> which is well-formed only if each element of <code>_1</code> is strictly greater than the corresponding element of <code>_2</code>.</p>
  
  <p>Since it's slightly more complicated in practice (although for the purpose of this MWE we can pretend there's all there is to it), I've written a custom generator for it.</p>
  
  <p>I then added two trivial tests (including the most trivial of all, <code>1 == 1</code>) and in both cases the tests fail, with the message<code>Gave up after only XX passed tests. YYY tests were discarded.</code></p>
  
  <p>Why is it, and how do I fix it?</p>
  
  <p>Attached is my test suite and the output.</p>
  
  <hr>
  
  <pre><code>package com.foo.bar
  
  import org.scalacheck._
  import Prop._
  import Arbitrary._
  
  object FooSpecification extends Properties("FooIntervals") {
  
    type FooIntervals = (List[Double], List[Double])
  
    /* This is supposed to be a tuple of lists s.t. each element of _1
     *  is &lt; the corresponding element of _2
     * 
     *  e.g. (List(1,3,5), List(2,4,6))
     */
  
    implicit def arbInterval : Arbitrary[FooIntervals] =
      Arbitrary {
        /**
          * Yields a pair (low, high) s.t. low &lt; high
          */
        def GenPair : Gen[(Double, Double)] = for {
          low &lt;- arbitrary[Double]
          high &lt;- arbitrary[Double].suchThat(_ &gt; low)
        } yield (low, high)
  
        /**
          * Yields (List(x_1,...,x_n), List(y_1,...,y_n))
          * where x_i &lt; y_i forall i and 1 &lt;= n &lt; 20
          */
        for {
          n &lt;- Gen.choose(1,20)
          pairs : List[(Double, Double)] &lt;- Gen.containerOfN[List, (Double, Double)](n, GenPair)
        } yield ((pairs.unzip._1, pairs.unzip._2))
      }
  
    property("1 == 1") = forAll {
      (b1: FooIntervals)
      =&gt;
      1 == 1
    }
  
    property("_1.head &lt; _2.head") = forAll {
      (b1: FooIntervals)
      =&gt;
      b1._1.head &lt; b1._2.head
    }
  }
  </code></pre>
  
  <hr>
  
  <pre><code>[info] ! FooIntervals.1 == 1: Gave up after only 32 passed tests. 501 tests were discarded.
  [info] ! FooIntervals._1.head &lt; _2.head: Gave up after only 28 passed tests. 501 tests were discarded.
  [info] ScalaTest
  [info] Run completed in 1 second, 519 milliseconds.
  [info] Total number of tests run: 0
  [info] Suites: completed 0, aborted 0
  [info] Tests: succeeded 0, failed 0, canceled 0, ignored 0, pending 0
  [info] No tests were executed.
  [error] Failed: Total 1, Failed 1, Errors 0, Passed 0
  [error] Failed tests:
  [error]     com.foo.bar.FooSpecification
  </code></pre>