4

Fooを受け取るコンストラクタを持つ型がありIntます。scalacheck で使用するimplicit Arbitraryforを定義するにはどうすればよいですか?Foo

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

しかし、もう少し簡単な方法が必要だとまだ感じています。

4

1 に答える 1

2

Foo-creating 関数全体を次のように定義する代わりに、アンダースコア表記を使用できます(i: Int) => new Foo(i))

class Foo(i: Int)

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

Fooこれが機能するのは、 が を取り、Intが にmapマッピングされていることを Scala が認識しているためですInt。そのため、すべてを明示的に綴る必要はありません。

したがって、これは少し短くなります。

implicit def arbFoo = Arbitrary(Gen.resultOf(new Foo(_)))
于 2012-04-03T12:11:01.730 に答える