2012-04-03 11 views
4

私はタイプFooで、コンストラクタはIntです。 scalachckで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 -creating関数を定義するのアンダースコア表記を使用することができます。

class Foo(i: Int) 

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

ScalaはFooIntを取ることを知っている、とmapInt秒以上のマッピングであることをので、これは動作します、それをすべて明示的に綴る必要はありません。

だから、これは少し短いです:

implicit def arbFoo = Arbitrary(Gen.resultOf(new Foo(_))) 
+1

は実際には、ケースクラスはScalaでは関数として扱われるので、あなたはさらに簡単にそれを書くことができます。arbFoo =任意(Gen.resultOf(フー))デフ '暗黙の'。 –

関連する問題