簡體   English   中英

在scala檢查中為運行時類型啟用隱式導入。 “找不到參數的隱式值”

[英]enable implicit import for runtime type in scala check. “could not find implicit value for parameter”

我正在使用ScalaCheck庫和ScalaTest在Scala中測試自己的自制Monoid

嘗試實施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中實現什么目標?

這段代碼編譯

不會的 您給出的錯誤是編譯錯誤。 應該通過添加它抱怨的隱式參數來解決此問題:

def assertIdentityBehaviour[A](M: Monoid[A])(implicit arbA: Arbitrary[A]) = ...
// or equivalently, def assertIdentityBehaviour[A: Arbitrary](M: Monoid[A]) = ...

您僅使用A 調用 assertIdentityBehaviour ,而其參數可用,但是錯誤在於其定義

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM