2010-11-18 1 views
6

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

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

Могу ли я сделать это с помощью модуля Set ocaml?

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

ответ

8

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

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 для сравнения.