[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: ocaml-dns- quick ocaml question



On Mon, Jun 18, 2012 at 5:26 PM, Richard Mortier
<Richard.Mortier@xxxxxxxxxxxxxxxx> wrote:
> i have two types, rr_type and q_type. rr_type is a subset of q_type, extended 
> it by about 5 elements. both are currently implemented in Dns.Packet as 
> cenums which are translated to variant types.
>
> i've just realised that (of course?) this means that the last definition 
> (rr_type) overrides the first (q_type) as they have overlapping elements.
>
> is there a nice/idiomatic way around this without either going to polymorphic 
> variant types (that's what the `T types are called, right?) or just defining 
> the cenum q_type with rr_type aliased to it (for slightly better 
> readability), and using that everywhere?
>
> eg., should i do something like create submodules Qtype and RRtype of Packet, 
> and define cenum t in each?


I see several possibilities:

- use polymorphic variants (yes that's what `Ts are called)

- use one variant type and add assertion checks or other dynamic failure (bad!)

- use several submodules

- prefix the variants (very common) (feels similar to submodules but prevents
  "open"-induced ambiguities)
type q =
  | Q_Foo
  | Q_Bar of int
type rr =
  | RR_Foo
  | RR_Bar of int
  | RR_Baz of float

- use GADTs (requires OCaml 4.00 (still in beta)) (I am unsure of the proper
  syntax, check the manual if need be)
type q
type rr
type 'a t =
  | Foo : 'a t
  | Bar : int -> 'a t
  | Baz : float -> q t (* This branch forces the ['a] to be instantiated with
                          [q], thus preventing anyuse with functions requiring
                          [rr t]
                        *)



Cheers,
-- 
_______
Raphael



 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.