0

私は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つしか追加できないため、これを取得する方法がわかりません:/

4

1 に答える 1

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ソースで定義されている場所に続いて、を含む一般的なコレクションタイプにsを提供する暗黙を提供するBuildableオブジェクト()があることがわかりました。したがって、それをスコープに含めるために必要なのはすべてです。これは次の方法で実行できます。org.scalacheck.util.BuildableBuildableArray

  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は次のとおりです。

implicit def buildableArray[T](implicit cm: ClassManifest[T]) = 
  new Buildable[T,Array] {
    def builder = mutable.ArrayBuilder.make[T]
  }
于 2012-10-18T17:43:42.903 に答える