2012-10-18 6 views
0

scalecck를 사용하고 있으며 지금 일반 프로그래밍 스프의 중간에 있습니다. 공식 가이드이 예를 나타낸다 :scalacheck 함수에 대한 2 implicits 얻기

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)) 
} 

한편, 내 시험 I 형 배열 [배열 [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, 배열]) org.scalacheck.Gen [배열 [T ]]. 지정되지 않은 값 매개 변수 b. - 매개 변수 b에 대한 암시 적 값을 찾을 수 없습니다. org.scalacheck.util.Buildable [T, Array] - 매개 변수 b에 대한 암시 적 값을 찾을 수 없습니다. org.scalacheck.util.Buildable [T, Array] - 충분하지 않습니다. org.scalacheck.Gen [Array [T]] : 컨테이너 containerName에 대한 인수. 지정되지 않은 값 매개 변수 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]에 암묵적으로 필요 ... 암시 적 인수를 하나만 추가 할 수 있기 때문에이 방법을 모릅니다./

답변

2

거의 다 왔어. 오류의 중요한 부분은

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

그래서, 누락 된 인수 거기 containerOfN의 방법 정의를 살펴보면 could not find implicit value for parameter b: org.scalacheck.util.Buildable[T,Array]

입니다. 유형 Buildable[T,Array]의 암시 적 인수가 필요합니다. ~ Buildable이 scalacheck 소스에 정의되어있는 곳에서 나는 Array을 포함하는 일반적인 컬렉션 유형에 Buildable을 제공하는 implicits를 제공하는 객체 (org.scalacheck.util.Buildable)가 있음을 발견했습니다. 그래서 모든 것을 범위로 가져와야합니다.

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] 
    } 
+0

사실이 작동하지 않습니다. 나는 객체와 함수로 가져 오기를 시도했지만 아무것도 작동하지 않는 것 같습니다 :/실용적인 예제를 줄 수 있습니까? – Felix

+0

흠. 암시 적으로 가져올 Buildable의 유형을 지정해야하는 것처럼 보입니다. 당신은'implicitly' 함수로 그것을 할 수 있습니다. 또는 행렬 함수에 대한 암시 적 매개 변수를 사용하여 작업하려고 했으므로 나는 그것을 바로 잡기위한 답을 편집했다. 그래도 할 수있는 좋은 방법이 있다고 확신합니다. – rjsvaljean

+0

일단 내가 다시 일하러 가자. – Felix