определение простого неявного арбитража - PullRequest
4 голосов
/ 03 апреля 2012

У меня есть тип Foo с конструктором, который принимает Int.Как определить implicit Arbitrary для Foo для использования с scalacheck?

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

Но я все еще чувствую, что должен быть немного более простой способ.

1 Ответ

2 голосов
/ 03 апреля 2012

Ну, вы можете использовать обозначение подчеркивания вместо определения всей Foo -создавающей функции как (i: Int) => new Foo(i)):

class Foo(i: Int)

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

Это работает, потому что Scala знает, что Foo принимает Intи что map отображает на Int с, так что нет необходимости указывать все это явно.

Так что это немного короче:

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