2016-07-07 5 views
0

내가, 내가 제목에 암시 적 오류를 DRY 테스트를 구현하기 위해 시도 할 때 ScalaCheck 라이브러리와 ScalaTest은 스칼라 검사에서 런타임 유형에 대한 암시 적 가져 오기를 활성화합니다.

를 사용하여 스칼라에서 내 자신의 집에서 양조 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 
    } 
... 
} 

그리고 테스트 스위트 : 여기

Error:(16, 12) could not find implicit value for parameter arbA: org.scalacheck.Arbitrary[A] 
    forAll { (a: A) => 
    ^

intAddition 모노 이드의 구현입니다

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

이 코드는 컴파일되지만 실행시 오류가 발생합니다 (런타임 유형 삭제?). 내가 달성하고자하는 것은 스칼라에서 가능합니까?

답변

1

이 코드는 그렇지 않은

컴파일; 오류는 컴파일 오류입니다. 당신은 에만 매개 변수를 사용할 수있는 A으로assertIdentityBehaviour를 호출

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

하지만 오류는 정의에 있습니다 : 그것은 그것에 대해 불평을 암시 적 매개 변수를 추가하여 고정한다.

+0

사과드립니다. 오류가 IDE에 표시되지 않지만 sbt 출력에 표시됩니다. 나는 일반적으로 스칼라를 처음 사용한다 : P – coderatchet