在scala检查中为运行时类型启用隐式导入。 "找不到参数"的隐含值。

时间:2016-07-07 10:30:27

标签: scala implicit-conversion scalatest scalacheck

我使用Monoid库和ScalaCheck

在scala中测试我自己的自制ScalaTest课程

在尝试实施DRY测试时,我在标题中得到隐含错误:

Error:(16, 12) could not find implicit value for parameter arbA: org.scalacheck.Arbitrary[A]
    forAll { (a: A) =>
       ^

这是intAddition Monoid:

的实现
trait Monoid[A] {
  def op(a1: A, a2: A): A
  def zero: A
}

object Monoid {
...
  val intAddition: Monoid[Int] = new Monoid[Int] {
    override def op(a1: Int, a2: Int): Int = a1 + a2
    override def zero: Int = 0
  }
...
}

测试套件:

import org.fpinscala.monoids.Monoid._
import org.fpinscala.testutils.UnitSpec
import org.scalatest.prop.PropertyChecks
import org.scalacheck.Arbitrary._

import scala.language.implicitConversions

class MonoidSpec extends UnitSpec with PropertyChecks {

  def assertIdentityBehaviour[A](M: Monoid[A]): Unit = {
    import M._
    forAll { (a: A) =>
      op(zero, a) should be(a)
      op(a, zero) should be(a)
    }
  }

  behavior of "intAdditionMonoid"

  it should "obey identity laws" in {
    assertIdentityBehaviour(intAddition)
  }
}

此代码编译但在运行时失败(运行时类型擦除?)。 我在Scala中试图实现的目标是什么?

1 个答案:

答案 0 :(得分:1)

  

此代码编译

没有;你给出的错误是编译错误。它应该通过添加它抱怨的隐式参数来修复:

Int

您只能使用参数可用的def assertIdentityBehaviour[A](M: Monoid[A])(implicit arbA: Arbitrary[A]) = ... // or equivalently, def assertIdentityBehaviour[A: Arbitrary](M: Monoid[A]) = ... 调用 assertIdentityBehaviour,但错误在定义中。