Определение простого неявного арбитража
У меня есть тип 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 ответ
Решение
Ну, вы можете использовать обозначение подчеркивания вместо определения целого Foo
-создание функции как (i: Int) => new Foo(i))
:
class Foo(i: Int)
(1 to 3).map(new Foo(_))
Это работает, потому что Скала знает, что Foo
занимает Int
и что map
наносит на карту Int
s, так что нет необходимости прописывать все это явно.
Так что это немного короче:
implicit def arbFoo = Arbitrary(Gen.resultOf(new Foo(_)))