2010-07-09 3 views
3

Предположим, у меня есть тип, определенный в качествегетерогенные множества в OCaml

type value = 
     None 
    | Int of int 
    | Float of float 
    | Complex of Complex.t 
    | String of string 
    | Char of char 
    | Bool of bool 

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

Как это сделать в этом примере? Так как value не может использоваться непосредственно внутри функтора Set.Make?

Тогда, конечно, мне нужно уметь полностью упорядочить эти значения, поэтому я должен придумать что-то вроде предоставления предопределенного порядка различным типам, а затем упорядочить их по их эффективному значению .. Я прав?

Так, например, я могу принять решение Int of int < Float of int и Int x < Int y, если x < y. Является ли это практическим подходом к тому, чего я пытаюсь достичь?

+0

Вы хотите что хотите сравнить: Int int int Float of float? – aneccodeal

ответ

7

Set.Make функтор переводит модуль с подписью Set.OrderedType:

module type OrderedType = sig type t val compare : t -> t -> int end 

Для сравнения можно использовать Pervasives.compare, если у вас нет каких-либо требований о порядке и результатах возвращенного min_eltmax_elt /. Таким образом, параметр для функтора может быть таким же простым, как:

module T = struct type t = value let compare = compare end 
+0

Но это позволит сравнить между int и float float (я думаю, что это то, о чем спрашивает OP, хотя он пишет: Int int aneccodeal

+0

Проблема в том, что мне нужно предоставить способ упорядочить различные типы данных, чтобы иметь возможность использовать 'Set', поэтому мне было интересно, заставляете ли вы форсировать определенную иерархию (например,' None Jack

+1

@Jack 'Pervasives.compare' автоматически сделает разумное сравнение; Я считаю, что он реализует иерархию, которую вы предлагаете самостоятельно. Нет необходимости определять свою собственную функцию сравнения, если у вас нет особых потребностей. –

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