From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Original-To: caml-list@sympa.inria.fr Delivered-To: caml-list@sympa.inria.fr Received: from mail1-relais-roc.national.inria.fr (mail1-relais-roc.national.inria.fr [192.134.164.82]) by sympa.inria.fr (Postfix) with ESMTPS id C8E877ED7A for ; Wed, 19 Sep 2012 09:49:54 +0200 (CEST) Received-SPF: None (mail1-smtp-roc.national.inria.fr: no sender authenticity information available from domain of dmhouse@gmail.com) identity=pra; client-ip=209.85.216.47; receiver=mail1-smtp-roc.national.inria.fr; envelope-from="dmhouse@gmail.com"; x-sender="dmhouse@gmail.com"; x-conformance=sidf_compatible Received-SPF: Pass (mail1-smtp-roc.national.inria.fr: domain of dmhouse@gmail.com designates 209.85.216.47 as permitted sender) identity=mailfrom; client-ip=209.85.216.47; receiver=mail1-smtp-roc.national.inria.fr; envelope-from="dmhouse@gmail.com"; x-sender="dmhouse@gmail.com"; x-conformance=sidf_compatible; x-record-type="v=spf1" Received-SPF: None (mail1-smtp-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@mail-qa0-f47.google.com) identity=helo; client-ip=209.85.216.47; receiver=mail1-smtp-roc.national.inria.fr; envelope-from="dmhouse@gmail.com"; x-sender="postmaster@mail-qa0-f47.google.com"; x-conformance=sidf_compatible X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AmICACt4WVDRVdgvk2dsb2JhbABFqmKRZggjAQEBAQkJCwkUBCOCIAEBAQQSAiwBGxILAQMMBgULAwoNISEBAREBBQEKEgYTEhCHTgEDDAubfAkDjCWCc4UUChknAwpZiHQBBQyKLmKGQQOUDoFVgRSKA4MrFimEBw X-IronPort-AV: E=Sophos;i="4.80,447,1344204000"; d="scan'208";a="173761878" Received: from mail-qa0-f47.google.com ([209.85.216.47]) by mail1-smtp-roc.national.inria.fr with ESMTP/TLS/RC4-SHA; 19 Sep 2012 09:49:54 +0200 Received: by qadc11 with SMTP id c11so3973673qad.6 for ; Wed, 19 Sep 2012 00:49:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type; bh=8Pi4DfziePKj7kUTUZMofX/bMIFQz3yVzPFXLWT4mS8=; b=dMtwX+3hap/CLReObBjYbIoW/dpkKOcYcIvCx0hyLZDDjTHqEXJ+GrKnc55CtnSlEC 1wTvdzhiqQ9x6u6Omwy6zeFejI3rZd++Q6aXKS2z9QVB0qCof5qhMOstba3XrLcnbkP/ 2dzd+uAnpzmaaH7HFqfn5kheIu4/N37j2WhWL1vFW1HatZ26ursS6KZ+Fi0y6dtsnjZZ +K6LyqCgaWiCcdOMYCr+8qAf4B9I4ViZHGj4j5NqiVmMCT4dbNN3gYujqpKJ5Pc4c1RI wqz8M3UP2sQ6GbXKzYXM5y9eTEKP/K9LIUcFBVOeVVVB0gFBv2f6+InfAq2jUPNklyIy F/2A== MIME-Version: 1.0 Received: by 10.229.136.208 with SMTP id s16mr1481627qct.112.1348040993242; Wed, 19 Sep 2012 00:49:53 -0700 (PDT) Received: by 10.49.35.194 with HTTP; Wed, 19 Sep 2012 00:49:52 -0700 (PDT) In-Reply-To: References: <505929CD.70206@gmail.com> Date: Wed, 19 Sep 2012 08:49:52 +0100 Message-ID: From: David House To: Malcolm Matalka Cc: Edgar Friendly , caml-list@inria.fr Content-Type: text/plain; charset=ISO-8859-1 Subject: Re: [Caml-list] Expressing module sig and impl in mli file So, this depends. If you have an identifier type that are internally just strings, then the simplest way is as I said before: module Bar = String_id (* or = String, both will work *) module Bar : sig type t include Identifiable with type t := t (* other operations on your Bar go here *) end The Identifiable signature includes the Comparable signature, which includes a map module. So then you have a type ['a Bar.Map.t], which is a map from Bar.t's to 'a. If you want to use your own comparison function, then you can do the following: module Bar = struct module T = struct type t = string with sexp let compare = ... end include T include Comparable.Make(T) let of_string = Fn.id let to_string = Fn.id end module Bar : sig type t include Comparable with type t := t (* Map module, compare, etc. *) include Strinagable with type t := t (* to_string, of_string *) end This will generate a map module that uses the comparison function you define. If additionally you can define a hash function, then you can do the following: module Bar = struct module T = struct type t = string with sexp let compare t1 t2 = ... let hash t = ... end include T include Comparable.Make(T) include Hashable.Make(T) let of_string = Fn.id let to_string = Fn.id end module Bar : sig type t include Comparable with type t := t (* Set module, Map module, compare, etc. *) include Strinagable with type t := t (* to_string, of_string *) include Hashable with type t := t (* hash, Table module, Hash_set module, etc. *) end And the final signature is actually equal (very nearly) to Identifiable, so you'd just write: module Bar : Identifiable On 19 September 2012 08:36, Malcolm Matalka wrote: > Yes I think I'm confused. In all parts of this module I want the > Identifiable behaviour, but at the same time I want a Map of these > identifiers to something, so this turned in to me trying to jerry-rig > that rather than thinking about what I actually want. > > Can something that is Identifiable be the key to a Map (in Core)? Am > I doing something wrong if I want that? > > Thanks > > /M > > On Wed, Sep 19, 2012 at 9:11 AM, David House wrote: >> The standard way of doing this is as follows (note that Identifier is >> changing to Identifiable in the next version, so I'll use that >> terminology): >> >> module Bar : sig >> type t = string >> include Identifiable with type t := t >> end >> >> But if this is literally what you're doing, I'm sort of confused. The >> point of identifiable is that you have explicit to_string/from_string >> functions and the type equality with string is not exposed. E.g. you >> might want to use a different comparison function than string >> equality. If you expose the type equality with string, then people are >> free to use String.compare on your type, so you don't get the >> abstraction you wanted. >> >> -- >> Caml-list mailing list. Subscription management and archives: >> https://sympa-roc.inria.fr/wws/info/caml-list >> Beginner's list: http://groups.yahoo.com/group/ocaml_beginners >> Bug reports: http://caml.inria.fr/bin/caml-bugs >>