#list #ocaml #permutation #combinations
#Список #ocaml #перестановка #комбинации
Вопрос:
У меня есть два списка, скажем, например :
let x = [1;2];;
let y = [true;false];;
Я хочу, по сути, иметь список списков (int * boolean) с
[[(1,true);(2;false)];[(1,true);(2,true);];[(1,false);(2,true);];[(1,false);(2,false);]]
У кого-нибудь есть идеи, как это сделать?
Ответ №1:
Вопрос не очень хорошо указан относительно того, что именно представляет собой операция. О чем [(1,true);(1,false)]
? Кажется, что операция не является симметричной — элементы в x
всегда отображаются в таком порядке, в то время как элементы в y
могут повторяться и появляться в любом порядке. Может быть, это поможет, если вы разделите его на две задачи:
- Каждая перестановка с повторением второго списка
- Zip каждый результат с первым списком
Ответ №2:
Я думаю, что никто не отвечает, потому что это похоже на домашнюю задачу. Я бы начал с рассмотрения только вторых элементов всех пар в вашем желаемом результате. Я вижу довольно правильную структуру: TF, TT, FT, FF. Это было бы немного более регулярно в порядке (скажем) FF, FT, TF, TT. В любом случае, как только вы сможете составить список списков, который выглядит следующим образом, довольно легко связать списки с другими списками, используя функции из List
модуля.
(Вы могли бы получить больше ответов, если бы показали некоторые вещи, которые вы пробовали, и объяснили, почему они не сработали.)
С уважением,
Ответ №3:
Вы можете ознакомиться с документом модуля списка
В противном случае просто введите
$ cd `ocamlc -where`
$ less list.mli
Вы можете найти функции для того, что вы хотите сделать.