更高种类的 Scalacheck 问题 : diverging implicit expansion for type Arbitrary

标签 scala scalacheck higher-kinded-types

我定义了一个 monad 类型类,并尝试使用 scalacheck 验证其规律。

我有以下错误:

diverging implicit expansion for type org.scalacheck.Arbitrary[(A, Box[B])]

我的 scalacheck 代码如下:

class OptionMonadSpec extends MonadSpec[String, String, String, Option](Monad.optionMonad)

abstract class MonadSpec[A, B, C, Box[_] : ClassTag](monad: Monad[Box])
(implicit boxArb: Arbitrary[Box[A]], aArb: Arbitrary[A], bArb: Arbitrary[B], cArb: Arbitrary[C])
  extends Properties(s"Monad for ${classTag[Box[_]]}") {
  property("left identity") = forAll { (f: (A => Box[B]), a: A) =>
    val boxA: Box[A] = monad.pure(a)
    monad.flatMap(boxA)(f) == f(a)
  }
  property("right identity") = forAll { box: Box[A] =>
    monad.flatMap(box)(monad.pure) == monad
  }
  property("associativity") = forAll { (f: (A => Box[B]), g: (B => Box[C]), box: Box[A]) =>
    val boxB: Box[B] = monad.flatMap(box)(f)
    monad.flatMap(boxB)(g) == monad.flatMap(box) { a =>
      val boxB: Box[B] = f(a)
      monad.flatMap(boxB)(g)
    }
  }
}

我是否错过了隐式任意类型中的某些内容?

这是我的单子(monad):

trait Monad[Box[_]] extends Functor[Box] {

  def pure[A](a: A): Box[A]

  def flatMap[A, B](boxA: Box[A])(f: A => Box[B]): Box[B]

}

object Monad {

  implicit val optionMonad = new Monad[Option] {

    override def pure[A](x: A): Option[A] = Some(x)

    override def flatMap[A, B](boxA: Option[A])(f: A => Option[B]) = boxA.flatMap(f)

    override def map[A, B](boxA: Option[A])(f: A => B) = boxA.map(f)
  }
}

谢谢

最佳答案

您在范围内有一个隐式 Arbitrary[Box[A]],但没有 Arbitrary[Box[B]] (Scalacheck 需要它)为 A => Box[B] 创建一个)或为 Arbitrary[Box[C]] (稍后会要求)。

更原则的方法是创建类似的东西

trait Arbitrary1[F[_]] {
  def liftArb[A](arb: Arbitrary[A]): Arbitrary[F[A]]
}

并提供Arbitrary1[Box],但在调用forAll时需要更加明确。

关于更高种类的 Scalacheck 问题 : diverging implicit expansion for type Arbitrary,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47748857/

相关文章:

scala - 如何使用 ScalaCheck 生成打乱的序列?

scala - 输入隐式的同义词?

Scala 递归类型和类型构造函数实现

scala - 在 Scala 中处理高种类对象时,类型信息会丢失

Scala 类主体或主构造函数主体

scala - 使用严格的函数式编程从偏序集生成 DAG

scala - 多态性在scala中没有按预期工作

scala - scala构造函数参数的可访问性

0 <= x < 2^64 之间的 Scalacheck 数字生成器

用于 Web URL 的 ScalaCheck 生成器