2013-12-05 1 views
1

Я хотел бы иметь в комплекте:OCaml - как сохранить пару междунар + мой собственный тип в наборе

(int * int * (my_own_type)) 

И я хочу элементы wolud сравниваться по формуле (Int * Int) - my_own_set не имеет влияние на порядок. Единственное, что мне нужно - это быстрый поиск элемента.

Как это сделать?

+2

может быть вам нужна «карта»? – newacct

ответ

2

Вам нужно сделать модуль, который делает сравнение вы хотите (адаптировано из https://stackoverflow.com/a/4277832):

module MyTypeOrdered = struct 
    type t = int * int * (my_own_type) 
    let compare (x1, y1, _) (x2, y2, _) = compare (x1, y1) (x2, y2) 
end 

module MyTypeSet = Set.Make(MyTypeOrdered) 

С картами это очень похоже

module IntInt = struct 
    type t = int * int 
    let compare = compare 
end 

module MyTypeMap = Map.Make(IntInt) 

или просто

module MyTypeMap = Map.Make(struct type t = int * int let compare = compare end) 
+0

Так должен ли я написать свое сравнение? Какие правила связаны со сравнением? – user3052477

+0

Цитирование связанного ответа: «сравнить a b = 0, если a = b, сравнить a b <0, если a

+0

Если я могу быстро найти элемент в наборе? Я имею в виду, что найти объект возврата, в этом случае let (a, b, my_object) = set.find (a, b) Я бы хотел искать по парам – user3052477

Смежные вопросы