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

У меня есть два списка, скажем, например:

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);]]

Кто-нибудь знает, как это сделать?


person Ven    schedule 21.10.2011    source источник


Ответы (3)


Вопрос не очень конкретизирован, что именно является операцией. А как насчет [(1,true);(1,false)]? Кажется, что операция не симметрична — вещи в x всегда появляются в этом порядке, а вещи в y могут повторяться и появляться в любом порядке. Возможно, было бы полезно, если бы вы разбили его на две задачи:

  1. Каждая перестановка с повторением второго списка
  2. Заархивируйте каждый результат с первым списком
person newacct    schedule 22.10.2011

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

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

С уважением,

person Jeffrey Scofield    schedule 21.10.2011

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

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

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

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

person ymotongpoo    schedule 22.10.2011