Ocaml: Как получить список всех комбинаций перестановки двух списков?

#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 могут повторяться и появляться в любом порядке. Может быть, это поможет, если вы разделите его на две задачи:

  1. Каждая перестановка с повторением второго списка
  2. Zip каждый результат с первым списком

Ответ №2:

Я думаю, что никто не отвечает, потому что это похоже на домашнюю задачу. Я бы начал с рассмотрения только вторых элементов всех пар в вашем желаемом результате. Я вижу довольно правильную структуру: TF, TT, FT, FF. Это было бы немного более регулярно в порядке (скажем) FF, FT, TF, TT. В любом случае, как только вы сможете составить список списков, который выглядит следующим образом, довольно легко связать списки с другими списками, используя функции из List модуля.

(Вы могли бы получить больше ответов, если бы показали некоторые вещи, которые вы пробовали, и объяснили, почему они не сработали.)

С уважением,

Ответ №3:

Вы можете ознакомиться с документом модуля списка

В противном случае просто введите

 $ cd `ocamlc -where`
$ less list.mli
 

Вы можете найти функции для того, что вы хотите сделать.