【问题标题】:Difference between ScalaCheck Arbitrary[T] and Scalacheck Gen[T]ScalaCheck Arbitrary[T] 和 Scalacheck Gen[T] 之间的区别
【发布时间】:2014-02-24 08:42:27
【问题描述】:

在我的测试中,我非常广泛地使用 Specs2 + ScalaCheck,并且有一些模式需要考虑。我还没有发现我的函数应该使用 Arbitrary[T] 还是 Gen[T],因为它们非常相似:

sealed abstract class Arbitrary[T] {
  val arbitrary: Gen[T]
}

函数签名会是这样吗:

maxSizedIntervalArbitrary[A,B](implicit ordering:Ordering[A], genStart:Arbitrary[A], genEnd:Arbitrary[B]):Arbitrary[TreeMap[A,B]]

还是我应该在Gen 抽象级别工作?

【问题讨论】:

标签: scala scalacheck


【解决方案1】:

我会说两者都做:

def maxSizedIntervalArbitrary[A,B](genStart:Gen[A], genEnd:Gen[B])(implicit ordering:Ordering[A]):Gen[TreeMap[A,B]]

implicit def maxSizedIntervalArbitrary[A,B](implicit ordering:Ordering[A], genStart:Arbitrary[A], genEnd:Arbitrary[B]):Arbitrary[TreeMap[A,B]] = 
  Arbitrary(maxSizedIntervalArbitrary(arbitrary[A], arbitrary[B]))

Arbitrary 基本上用于提供隐式Gens,因此这允许使用forAll 变体与显式Gen 和隐式Arbitrary。我不认为非implicit Arbitrary 有用。

【讨论】:

  • 有道理。任意冲突怎么办?(在任意伴侣对象中定义了隐含的任意性,这让我的生活变得不可能)
  • 在这种情况下,我认为您可能必须避免使用Arbitrary 并仅使用Gen 版本。为了尽量减少Gens 的显式传递,您可以添加一个采用implicit Arbitrary 并仍然返回Gen 的重载。
猜你喜欢
  • 1970-01-01
  • 2015-11-15
  • 1970-01-01
  • 2011-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-07
相关资源
最近更新 更多