Интересно, зачем нужен Arbitrary, потому что автоматическое тестирование свойств требует определения свойства, например
val prop = forAll(v: T => check that property holds for v)
и генератор значения v. В руководстве пользователя говорится, что вы можете создавать собственные генераторы для пользовательских типов (пример генератора для деревьев). Тем не менее, это не объясняет, зачем вам нужны еще и арбитры.
Вот инструкция
implicit lazy val arbBool: Arbitrary[Boolean] = Arbitrary(oneOf(true, false))
Чтобы получить поддержку вашего собственного типа T, вам необходимо определить неявное def или val типа Arbitrary [T]. Используйте фабричный метод Arbitrary (...) для создания экземпляра Arbitrary. Этот метод принимает один параметр типа Gen [T] и возвращает экземпляр Arbitrary [T].
В нем ясно сказано, что нам нужен произвольный поверх общего. Обоснование произвольного не является удовлетворительным, хотя
Произвольный генератор - это генератор, используемый ScalaCheck при генерации значений для параметров свойств.
IMO, чтобы использовать генераторы, вам нужно импортировать их, а не оборачивать их в произвольные! В противном случае можно утверждать, что нам нужно обернуть произвольные файлы во что-то еще, чтобы сделать их пригодными для использования (и так до бесконечности, обертывая обертки до бесконечности).
Вы также можете объяснить, как arbitrary[Int]
преобразовывает тип аргумента в генератор. Это очень любопытно, и я чувствую, что это связанные вопросы.