首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Scalacheck新的可构建实例

Scalacheck新的可构建实例
EN

Stack Overflow用户
提问于 2016-09-26 22:00:15
回答 2查看 112关注 0票数 0

我有以下用于ScalaCheck的代码。其思想是使用Java HashSet作为容器自动生成整数集。下面的代码几年前还能用,但现在不能编译了。

代码语言:javascript
复制
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
            }

    }
} 

它现在失败了,原因是

代码语言:javascript
复制
...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中的用法(由用户指南指出)相匹配。有没有人知道在过去的几年里发生了什么变化,以及如何更新我的代码以使其再次工作?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-09-26 23:09:54

forAll()需要隐式Arbitrary[HashSet[Int]]。它可以使用带有隐式Buildable[T,HashSet[T]]HashSet[T] => Traversable[T]Gen.containerOf()来定义。

代码将如下所示:

代码语言:javascript
复制
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
    }

}
票数 0
EN

Stack Overflow用户

发布于 2016-09-27 17:31:52

这是我的最终解决方案。我按照Kawty的建议添加了一个从HashSetT到TraversableT的隐式函数(但不需要intHashSetGen)。我还使SimpleSpecification成为一个对象,并使该属性更有趣一些。

代码语言:javascript
复制
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
            }
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39704941

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档