Создать генератор из списка генераторов

Я хочу создать генератор из нескольких генераторов. У меня есть список генераторов

val generators: List[Gen] = List(Gen[Int], Gen[Double], Gen[String], ...)

Я не знаю, каков размер списка, он может быть любым.

Я хочу создать что-то вроде этого:

val listGen: Gen[List[Any]] = createListGenerator(generators)

person Mahmoud Hanafy    schedule 16.02.2016    source источник
comment
Я нашел это так: val listGen: Gen[util.ArrayList[Nothing]] = Gen.sequence(generators), я хочу, чтобы это было: Gen[List[Any]]   -  person Mahmoud Hanafy    schedule 16.02.2016
comment
Получение Gen[util.ArrayList[Nothing]] странно. Вы уверены, что не видите Gen[java.util.ArrayList[Any]]? Тип generators List[Gen[Any]] или что-то другое?   -  person badcook    schedule 16.02.2016


Ответы (2)


Если вы хотите, чтобы listGen предоставил вам произвольное количество элементов в произвольном порядке, полученных из одного или нескольких генераторов в generators, вы можете сделать следующее:

// Scala's type inference gets a bit finicky when combining Anys with CanBuildFroms
val comboGen = Gen.sequence[List[Any], Any](generators).flatMap(Gen.oneOf[Any])
val listGen = Gen.listOf(comboGen)

В качестве альтернативы, если вы хотите, чтобы listGen генерировало точно такое же количество элементов, сколько есть элементов в generators, и в том же порядке, вы можете просто сделать

val listGen = Gen.sequence[List[Any], Any](generators)
person badcook    schedule 16.02.2016
comment
Я не знаю, каков будет размер списка, он может быть любым. - person Mahmoud Hanafy; 16.02.2016
comment
Ах, я понимаю, что вы имеете в виду сейчас в своем вопросе. Я отредактировал свой ответ соответственно. - person badcook; 16.02.2016

Начнем со списка генераторов

val generators: List[Gen[Any]] = ???

Затем мы создаем генератор, который генерирует элементы, выбирая один генератор и получая элемент, сгенерированный этим генератором:

val genOne: Gen[Any] = for {
  gen <- Gen.oneOf(generators)
  item <- gen
} yield item

Мы можем использовать этот генератор для создания генератора списков

val listGen: Gen[List[Any]] = Gen.listOf(genOne)

Этот генератор списков создает список (возможно, пустой), который может содержать элементы, сгенерированные генераторами в исходном списке generators, однако не всегда включаются все генераторы, а порядок является случайным.

Например, если список generators содержит Gen[Int], Gen[Double] и Gen[String], то списки, сгенерированные listGen. Будет содержать любое количество целых, двойных и строк в любом порядке.

person Wellingr    schedule 16.02.2016
comment
Мне нужно, чтобы результат List[Any] был в том же порядке, что и генераторы - person Mahmoud Hanafy; 16.02.2016