2012-04-03 2 views
4

Int을 사용하는 생성자가있는 Foo 유형이 있습니다. scalacheck와 함께 Foo에 대해 implicitArbitrary을 정의하려면 어떻게해야합니까?간단한 암시 적 중재를 정의합니다

implicit def arbFoo: Arbitrary[Foo] = ??? 

나는 다음과 같은 해결책을했다,하지만 내 취향에 대해 조금 너무 "수동"낮은 수준의 : 이상적으로

val fooGen = for (i <- Gen.choose(Int.MinValue, Int.MaxValue)) yield new Foo(i) 

implicit def arbFoo: Arbitrary[Foo] = Arbitrary(fooGen) 

, 나는 고차 기능을 원하는 것이 어디 Int => Foo 기능을 연결하기 만하면됩니다.


나는 그것을 줄이려고 관리 :

implicit def arbFoo = Arbitrary(Gen.resultOf((i: Int) => new Foo(i))) 

그러나 약간 간단한 방법이있을 가지고있다처럼 나는 아직도 생각합니다.

답변

2

글쎄, 당신은 대신 (i: Int) => new Foo(i))으로 전체 Foo 스트럭처 기능을 정의하는 밑줄 표기를 사용할 수 있습니다

class Foo(i: Int) 

(1 to 3).map(new Foo(_)) 

이 작동 스칼라 FooInt 걸리는 것을 알고, 그리고 map 것을 Int의 이상 매핑이기 때문에 따라서 명시 적으로 철자를 쓰지 않아도됩니다.

그래서이 조금 짧은 :

당신이 쓸 수 있도록 사실, 사례 클래스, 스칼라 함수로 처리됩니다
implicit def arbFoo = Arbitrary(Gen.resultOf(new Foo(_))) 
+1

그것은 더 간단 :'암시 arbFoo 데프 = 임의 (Gen.resultOf (푸)) '. –