我有以下用于ScalaCheck的代码。其思想是使用Java HashSet作为容器自动生成整数集。下面的代码几年前还能用,但现在不能编译了。
import java.util.HashSet
import scala.collection._
import org.scalacheck.Properties
import org.scalacheck.Prop._
import org.scalacheck.util.Buildable
package simpletest {
class SimpleSpecification extends Properties("Simple") {
implicit def buildableHashSet[T] : Buildable[T,HashSet[T]] = new Buildable[T, HashSet[T]] {
def builder = new mutable.Builder[T,HashSet[T]] {
val al = new HashSet[T]
def +=(x: T) = {
al.add(x)
this
}
def clear() = al.clear()
def result() = al
}
}
property("simple") =
forAll{(a: HashSet[Int]) =>
a.size() == 1
}
}
} 它现在失败了,原因是
...simpletest/SimpleSpecification.scala:26: could not find implicit value for parameter a1: org.scalacheck.Arbitrary[java.util.HashSet[Int]]
forAll{(a: HashSet[Int]) => 我广泛地搜索了有关使用Buildable的说明,但在scalacheck用户指南中只能找到一个经过的参考。据我所知,我的用法与Buildable.scala中的用法(由用户指南指出)相匹配。有没有人知道在过去的几年里发生了什么变化,以及如何更新我的代码以使其再次工作?
发布于 2016-09-26 23:09:54
forAll()需要隐式Arbitrary[HashSet[Int]]。它可以使用带有隐式Buildable[T,HashSet[T]]和HashSet[T] => Traversable[T]的Gen.containerOf()来定义。
代码将如下所示:
package simpletest
import java.util.HashSet
import org.scalacheck.Arbitrary.arbitrary
import org.scalacheck.Prop._
import org.scalacheck.util.Buildable
import org.scalacheck.{Arbitrary, Gen, Properties}
import scala.collection.JavaConverters._
import scala.collection._
import scala.language.implicitConversions
class SimpleSpecification extends Properties("Simple") {
implicit def buildableHashSet[T]: Buildable[T, HashSet[T]] = new Buildable[T, HashSet[T]] {
def builder = new mutable.Builder[T, HashSet[T]] {
val al = new HashSet[T]
def +=(x: T) = {
al.add(x)
this
}
def clear() = al.clear()
def result() = al
}
}
implicit def hashSetTraversable[T](hashSet: HashSet[T]): Traversable[T] = {
hashSet.asScala
}
implicit val intHashSetGen: Arbitrary[HashSet[Int]] =
Arbitrary(Gen.containerOf[HashSet, Int](arbitrary[Int]))
property("simple") =
forAll { (a: HashSet[Int]) =>
a.size() == 1
}
}发布于 2016-09-27 17:31:52
这是我的最终解决方案。我按照Kawty的建议添加了一个从HashSetT到TraversableT的隐式函数(但不需要intHashSetGen)。我还使SimpleSpecification成为一个对象,并使该属性更有趣一些。
import java.util.HashSet
import scala.collection._
import scala.collection.JavaConverters._
import org.scalacheck.Properties
import org.scalacheck.Prop._
import org.scalacheck.util.Buildable
package simpletest {
object SimpleSpecification extends Properties("Simple") {
implicit def buildableHashSet[T] : Buildable[T,HashSet[T]] = new Buildable[T,HashSet[T]] {
def builder = new mutable.Builder[T,HashSet[T]] {
val al = new HashSet[T]
def +=(x: T) = {
al.add(x)
this
}
def clear() = al.clear()
def result() = al
}
}
implicit def traverseHashSet[T](s : HashSet[T]) : Traversable[T] = s.asScala
property("simple") =
forAll{(a: HashSet[Int]) =>
a.size() < 2
}
}
}https://stackoverflow.com/questions/39704941
复制相似问题