获取scalacheck函数的2个含义

时间:2012-10-18 17:29:49

标签: scala generics implicit scalacheck

我正在使用scalacheck,现在正处于通用编程汤的中间。官方指南显示了这个例子:

def matrix[T](g: Gen[T]): Gen[Seq[Seq[T]]] = Gen.sized { size =>
  val side = scala.math.sqrt(size).asInstanceOf[Int]
  Gen.listOfN(side, Gen.listOfN(side, g))
}

同时,对于我的测试,我需要一个Array [Array [T]]类型的矩阵。我尝试使用以下功能:

def matrix[T](g: Gen[T]): Gen[Array[Array[T]]] = Gen.sized { size =>
  val side = scala.math.sqrt(size).asInstanceOf[Int]
  val g1 = Gen.containerOfN[Array, T](side, g)
  Gen.containerOfN[Array, Array[T]](side, g1)
}

在这里,我遇到了麻烦。编译器说:

  

此行有多个标记      - 方法containerOfN没有足够的参数:(隐式b:org.scalacheck.util.Buildable [T,Array])org.scalacheck.Gen [Array [T]]。   未指定的值参数b。      - 找不到参数b的隐含值:org.scalacheck.util.Buildable [T,Array]      - 找不到参数b的隐含值:org.scalacheck.util.Buildable [T,Array]      - 方法containerOfN没有足够的参数:(隐式b:org.scalacheck.util.Buildable [T,Array])org.scalacheck.Gen [Array [T]]。   未指定的值参数b。

我知道像这样的东西通常是通过向函数添加隐式参数来解决的,但是,我还没有完成这项工作。

在构建通用数组时,我经常会遇到此错误,例如:

  def build[T](n:Int)(implicit m:ClassManifest[T]) = Array.ofDim[T](n)

但是,我担心我不完全了解发生了什么或者为什么需要这样做。

有人可以在scalacheck中解释如何制作正确的矩阵函数以及使用示例?有关使用隐式类清单构建序列的详细信息的详尽解释将非常受欢迎!

修改

  import org.scalacheck.util.Buildable._
  def matrix[T](g: Gen[T])(implicit b: Buildable[T, Array]): Gen[Array[Array[T]]] = Gen.sized { size =>

    val side = scala.math.sqrt(size).asInstanceOf[Int]
    val g1 = Gen.containerOfN[Array, T](side, g)
    Gen.containerOfN[Array, Array[T]](side, g1)
  }

仍然无效。需要隐式的Buildable [Array [T],Array] ...不知道如何得到这个,因为我只能添加1个隐式参数:/

1 个答案:

答案 0 :(得分:2)

你快到了。错误的重要部分是could not find implicit value for parameter b: org.scalacheck.util.Buildable[T,Array]

查看containerOfN

的方法定义
  def containerOfN[C[_],T](n: Int, g: Gen[T])(implicit b: Buildable[T,C]): Gen[C[T]] = ...

所以,这是你缺少的论点。您需要类型为Buildable[T,Array]的隐式参数。在scalacheck源中定义Buildable的地方之后,我发现有一个对象(org.scalacheck.util.Buildable)提供了对包含{{{}的常见集合类型提供Buildable的含义。 1}}。所以你需要把它带到范围内。你可以这样做:

Array

或者

  import org.scalacheck.util.Buildable._
  def matrix[T](g: Gen[T]): Gen[Array[Array[T]]] = Gen.sized { size =>
    val bT = implicitly[Buildable[T, Array]]
    val bArrayT = implicitly[Buildable[Array[T], Array]]

    val side = scala.math.sqrt(size).asInstanceOf[Int]
    val g1 = Gen.containerOfN[Array, T](side, g)
    Gen.containerOfN[Array, Array[T]](side, g1)
  }

import org.scalacheck.util.Buildable._ def matrix[T](g: Gen[T])(implicit bT: Buildable[T, Array], bArrayT: Buildable[Array[T], Array]): Gen[Array[Array[T]]] = Gen.sized { size => ... } 中您需要的具体内容是:

org.scalacheck.util.Buildable