I have hit this problem myself, trying to generate generic properties, that can later be instantiated for various concrete types. I found the OP's answer a bit crytpic, so I thought it would be good to provide a more elaborate one. I first repeat OP's answer slowly. Then show that the same applies to writing properties with scalacheck.
The key problem is that the following does not compile (I simplified the problem given by the OP):
def validPair[T] = Arbitrary.arbitrary[(T,T)]
With a modern Scala compiler you get a different error message:
diverging implicit expansion for type org.scalacheck.Arbitrary[(T, T)]
starting with method arbTuple2 in trait ArbitraryArities
(this to help those who Google for this problem today).
It suffices to bound the type parameter by arbitrary (the OP's answer was a bit cryptic on quick reading):
def validPair[T :Arbitrary] = Arbitrary.arbitrary[(T,T)]
Now the same needs to be done if you are defining generic properties. Here is an example of associativity axiom for monoids:
def associative[A :Arbitrary] (m: Monoid[A]) :Prop =
forAll ( (a1: A, a2: A, a3: A) => m.op(m.op(a1,a2), a3) == m.op(a1,m.op(a2,a3)) )
It yields a similar error without the bound of A to Arbitrary. I hope others starting to write their first generic properties with scalacheck will find this useful.