Определение простого неявного арбитража

У меня есть тип Foo с конструктором, который принимает Int, Как мне определить implicitArbitrary за 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 ответ

Решение

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

class Foo(i: Int)

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

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

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

implicit def arbFoo = Arbitrary(Gen.resultOf(new Foo(_)))
Другие вопросы по тегам