Определение множеств в ocaml - PullRequest
6 голосов
/ 18 ноября 2010

У меня проблема с созданием коллекции, содержащей разнородные элементы, в частности элемент будет структурирован следующим образом:

(a, 1), ((a, 1), 1)), ((a, 1), 1), 1) и т. д ....

можно ли это сделать с помощью модуля Set of ocaml?

кроме того, есть ли какая-то функция, которая позволяет мне делать декартово произведение между наборами (также неоднородное)?

Ответы [ 2 ]

8 голосов
/ 18 ноября 2010

Вы не можете создавать наборы разнородных элементов. Конечно, вы можете определить тип для объединения типов, если вы знаете их заранее. Похоже, что вы делаете, и это может быть рекурсивный тип, определенный как:

type ('a,'b) r = | L of 'a 
                 | N of (('a,'b) r * 'b)

Таким образом, ваши примеры будут построены как

N (L a,1)
N ( N (L a,1),1)
N ( N ( N (L a,1),1),1)

Тогда вы просто скомпонуете модуль Ordered, чтобы включить функцию сравнения.

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

0 голосов
/ 18 ноября 2010

Нет, из http://caml.inria.fr/pub/docs/manual-ocaml/libref/Set.S.html видно, что множества в модуле Set однородны.

Вместо словарей вы можете использовать подход, описанный в http://alan.petitepomme.net/cwn/2010.02.09.html.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...