【发布时间】:2016-11-04 07:16:21
【问题描述】:
升级到 scalacheck 1.13.3 后,我遇到了一个奇怪的问题,即派生 A => B Or C 的实例(其中 Or 本质上是一个轻量级 Either)几乎总是会失败。
这是我可以编写的重现问题的最简单代码:
import org.scalatest.FunSuite
import org.scalatest.prop.GeneratorDrivenPropertyChecks
import org.scalacheck.Shapeless._
class Testor extends FunSuite with GeneratorDrivenPropertyChecks {
sealed trait Or[+A, +B] extends Product with Serializable
case class Left[A](a: A) extends Or[A, Nothing]
case class Right[B](b: B) extends Or[Nothing, B]
test("reproduce") {
forAll { (i: Int, f: Int ⇒ Float Or Boolean) ⇒
f(i)
}
}
}
这失败了:
RetrievalError was thrown during property evaluation.
Message: couldn't generate value
Occurred when passed generated values (
arg0 = 0, // 30 shrinks
arg1 = <function1>
)
请注意,提供显式 Arbitrary[Float Or Boolean] 可以解决问题,因此很明显问题出在泛型派生中。
我不相信问题出在shapeless-scalacheck - 我尝试编写自己的泛型派生来查看它是否有帮助,但它以完全相同的方式失败了。
有些奇怪,但可能是由于任意函数的工作方式,函数实际上是生成的,但在评估时失败。
不胜感激任何帮助/建议,因为我有点卡住了。
【问题讨论】:
标签: scala shapeless scalacheck