caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
From: Mark Shinwell <mshinwell@janestreet.com>
To: Ollie Frolovs <of12343@my.bristol.ac.uk>
Cc: caml users <caml-list@inria.fr>
Subject: Re: [Caml-list] Creating a Map from custom type
Date: Thu, 14 Nov 2013 11:21:08 +0000	[thread overview]
Message-ID: <CAM3Ki750+0=4btNjx5vHDbuLime4NomadqL7wWq7ds2EG_DdDA@mail.gmail.com> (raw)
In-Reply-To: <7389AC6E-C25D-43B3-9A39-E59F92EF35AB@my.bristol.ac.uk>

On 14 November 2013 10:39, Ollie Frolovs <of12343@my.bristol.ac.uk> wrote:
> My current implementation uses associative lists, in subroute.ml:
>
> open Core.Std
> type t = ((int list * int) * (int * int list)) list
> let empty = []
> let to_list x = x
> let add t k v = List.Assoc.add t k v
> let find t k = List.Assoc.find t k
>
> I would like to use a Map instead. The key for my Map must have the type (int list * int) and the values have the type (int * int list). If i understood it correctly, because the key is a tuple and not one of the built-in simple data types (string, int, etc), because of this i have to provide a custom comparator. This is first thing that i am not sure of.

I think you need something like:

module Key = struct
  type t = int list * int with sexp, compare
end

module My_map = Map.Make (Key)

Then, for example:

  let map =
    My_map.add My_map.empty
      ~key:([42], 0)
      ~data:(1, [2])

The "with compare" auto-generates a "compare" function for
you.  Using explicit comparison functions, as Core strongly
encourages, does unfortunately mean a bit more code at times
but is arguably vastly more sustainable as your codebase
grows.  In such scenarios it becomes increasingly unlikely
that the correct notion of comparison on one of your many
abstract types coincides with the structural comparison
on whatever implementation those types happen to have today.

Mark

  parent reply	other threads:[~2013-11-14 11:21 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-11-14 10:39 Ollie Frolovs
2013-11-14 10:56 ` David Allsopp
2013-11-14 11:02 ` Malcolm Matalka
2013-11-14 11:21 ` Mark Shinwell [this message]
2013-11-14 12:03   ` Yaron Minsky
2013-11-14 12:11     ` David House
2013-11-15  9:36       ` Ollie Frolovs

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='CAM3Ki750+0=4btNjx5vHDbuLime4NomadqL7wWq7ds2EG_DdDA@mail.gmail.com' \
    --to=mshinwell@janestreet.com \
    --cc=caml-list@inria.fr \
    --cc=of12343@my.bristol.ac.uk \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).