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 mail4-relais-sop.national.inria.fr (mail4-relais-sop.national.inria.fr [192.134.164.105]) by sympa.inria.fr (Postfix) with ESMTPS id CCDB27ED7A for ; Wed, 19 Sep 2012 10:00:15 +0200 (CEST) Received-SPF: None (mail4-smtp-sop.national.inria.fr: no sender authenticity information available from domain of mmatalka@gmail.com) identity=pra; client-ip=209.85.214.182; receiver=mail4-smtp-sop.national.inria.fr; envelope-from="mmatalka@gmail.com"; x-sender="mmatalka@gmail.com"; x-conformance=sidf_compatible Received-SPF: Pass (mail4-smtp-sop.national.inria.fr: domain of mmatalka@gmail.com designates 209.85.214.182 as permitted sender) identity=mailfrom; client-ip=209.85.214.182; receiver=mail4-smtp-sop.national.inria.fr; envelope-from="mmatalka@gmail.com"; x-sender="mmatalka@gmail.com"; x-conformance=sidf_compatible; x-record-type="v=spf1" Received-SPF: None (mail4-smtp-sop.national.inria.fr: no sender authenticity information available from domain of postmaster@mail-ob0-f182.google.com) identity=helo; client-ip=209.85.214.182; receiver=mail4-smtp-sop.national.inria.fr; envelope-from="mmatalka@gmail.com"; x-sender="postmaster@mail-ob0-f182.google.com"; x-conformance=sidf_compatible X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AmICACt7WVDRVda2k2dsb2JhbABFqmKRZggjAQEBAQkJCwkUBCOCIAEBAQQSAiwBGxILAQMMBgULAwoNISEBAREBBQEKEgYTEhCHTgEDDAubfQkDjCWCc4UWChknAwpZiHQBBQyKLmKGQQOUDoFVgRSKA4MrFimECA X-IronPort-AV: E=Sophos;i="4.80,447,1344204000"; d="scan'208";a="156216578" Received: from mail-ob0-f182.google.com ([209.85.214.182]) by mail4-smtp-sop.national.inria.fr with ESMTP/TLS/RC4-SHA; 19 Sep 2012 10:00:15 +0200 Received: by obbun3 with SMTP id un3so1374577obb.27 for ; Wed, 19 Sep 2012 01:00:13 -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=+OEOPBwxY2CmelVyUep4XbmJ7Rn9tfydJdfNE4d5ORk=; b=o/kQA0f0sgoiMTJ7F5Ae5hWBLj504gNFMqu+srw8u5d+IcLToFMYb/3vZOksDtauPl 87fNjbcGvi7emeRMVPoFdkhr6XsN3BasQ2C+dmmhUk3Fq3HRBj7uab+w64Vc5CVPyXxc ZHlq1oNbCJz+8SIB9uON7U/BxC4myKokWqg9YRwe2F4ccFTye6dRopWgdAK9jxmFClMr rbnE2fnilsl8ze9X7mDjSXzJPTjY5Vmw47pKW209IsjjAbdC7vQDLwnjAKnKzrB//1NS 8qXq5qWn7vqj+USaFk1obdLlRVhR5j59XtwBNjSI6DIHRuMdeUG9qqRy7YG+hA0kfvEP HY9A== MIME-Version: 1.0 Received: by 10.182.18.143 with SMTP id w15mr2464950obd.6.1348041613757; Wed, 19 Sep 2012 01:00:13 -0700 (PDT) Received: by 10.76.23.9 with HTTP; Wed, 19 Sep 2012 01:00:13 -0700 (PDT) In-Reply-To: References: <505929CD.70206@gmail.com> Date: Wed, 19 Sep 2012 10:00:13 +0200 Message-ID: From: Malcolm Matalka To: David House 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 Ah great! What you said works! The problem I was running into was trying to do Map.Make(Bar). Still getting used to how Core organizes things. I looked around a bit on google as well but couldn't find an answer to this: what is the difference between = and := in a 'with'? The language reference section I looked at didn't seem to make a distinction. Thanks again, /M On Wed, Sep 19, 2012 at 9:51 AM, David House wrote: > Oh, and one more thing to mention. If your identifier types are not > strings, but you have of_string and to_string functions, then you can > do the following: > > module Bar = struct > module T = struct > type t = ... > let of_string = ... > let to_string = ... > end > include Identifiable.Of_stringable(T) > end > > module Bar : Identifiable > > On 19 September 2012 08:49, David House wrote: >> 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 >>>>