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

这是可行的,因为 Scala 知道它Foo需要一个Int, 并且map映射到Ints 上,所以没有必要明确地把它全部拼出来。

所以这有点短:

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