<?xml version="1.0" encoding="ISO-8859-1"?>

<!DOCTYPE message PUBLIC
  "-//MLarc//DTD MLarc output files//EN"
  "../../mlarc.dtd"[
  <!ATTLIST message
    listname CDATA #REQUIRED
    title CDATA #REQUIRED
  >
]>

  <?xml-stylesheet href="../../mlarc.xsl" type="text/xsl"?>


<message 
  url="2003/11/2fe7f757bc7b5d10efc2915878644160"
  from="brogoff@s..."
  author="brogoff@s..."
  date="2003-11-11T17:08:25"
  subject="Re: [Caml-list] Strange physical equality behavior"
  prev="2003/11/fcbf42708ad0d737e60ce7569d4ac60e"
  next="2003/11/65633c1752df3e2bba3cd125d0cb4054"
  prev-in-thread="2003/11/a13ba4cc36c14e7d7021336bcbc04024"
  prev-thread="2003/11/c1e744886a3affa901d1dcaf0e350359"
  next-thread="2003/11/09e582c31663ff8716cce84f773350e2"
  root="../../"
  period="month"
  listname="caml-list"
  title="Archives of the Caml mailing list">

<thread subject="[Caml-list] Strange physical equality behavior">
<msg 
  url="2003/11/01e1b29e39f68e928829da73207a8c30"
  from="Oleg Trott &lt;oleg_trott@c...&gt;"
  author="Oleg Trott"
  date="2003-11-09T18:34:28"
  subject="[Caml-list] Strange physical equality behavior">
<msg 
  url="2003/11/a33bcd6e98a9ec945c42f2e24c4f7045"
  from="Jacques Garrigue &lt;garrigue@k...&gt;"
  author="Jacques Garrigue"
  date="2003-11-10T01:33:39"
  subject="Re: [Caml-list] Strange physical equality behavior">
<msg 
  url="2003/11/a4fa114bc35fac9ad8b2bce95978fe86"
  from="Oleg Trott &lt;oleg_trott@c...&gt;"
  author="Oleg Trott"
  date="2003-11-10T02:25:58"
  subject="Re: [Caml-list] Strange physical equality behavior">
<msg 
  url="2003/11/9230ae0d897716b56921b56f5d31f9fe"
  from="Jacques Garrigue &lt;garrigue@k...&gt;"
  author="Jacques Garrigue"
  date="2003-11-10T08:29:32"
  subject="Re: [Caml-list] Strange physical equality behavior">
<msg 
  url="2003/11/31b3758dc01ba9496581b9fd7e7c1e48"
  from="Michal Moskal &lt;malekith@p...&gt;"
  author="Michal Moskal"
  date="2003-11-10T18:41:57"
  subject="Re: [Caml-list] Strange physical equality behavior">
<msg 
  url="2003/11/fc1129f81c56884cc7eeba1ab3565fec"
  from="Jacques Garrigue &lt;garrigue@k...&gt;"
  author="Jacques Garrigue"
  date="2003-11-11T01:35:16"
  subject="Re: [Caml-list] Strange physical equality behavior">
</msg>
</msg>
</msg>
</msg>
<msg 
  url="2003/11/50f653064d6e45748cb96c80bc084526"
  from="Oleg Trott &lt;oleg_trott@c...&gt;"
  author="Oleg Trott"
  date="2003-11-11T06:48:41"
  subject="Re: [Caml-list] Strange physical equality behavior">
<msg 
  url="2003/11/fcbf42708ad0d737e60ce7569d4ac60e"
  from="David Brown &lt;caml-list@d...&gt;"
  author="David Brown"
  date="2003-11-11T16:47:13"
  subject="Re: [Caml-list] Strange physical equality behavior">
<msg 
  url="2003/11/a13ba4cc36c14e7d7021336bcbc04024"
  from="William Lovas &lt;wlovas@s...&gt;"
  author="William Lovas"
  date="2003-11-12T00:32:48"
  subject="Re: [Caml-list] Strange physical equality behavior">
</msg>
</msg>
<msg 
  url="2003/11/2fe7f757bc7b5d10efc2915878644160"
  from="brogoff@s..."
  author="brogoff@s..."
  date="2003-11-11T17:08:25"
  subject="Re: [Caml-list] Strange physical equality behavior">
</msg>
</msg>
</msg>
</msg>
</thread>

<contents>
On Tue, 11 Nov 2003, Oleg Trott wrote:
&gt; On Sunday 09 November 2003 08:33 pm, Jacques Garrigue wrote:
&gt; &gt; The functorial approach offers a much cleaner solution.
&gt;
&gt; I'm not convinced.
&gt;
&gt; With non-functorial sets:
&gt;
&gt; type t = Leaf of string | Node of t Set.t
&gt;
&gt; How would you do this with functorial sets? Perhaps like this:
&gt;
&gt; http://groups.google.com/groups?selm=fa.dlqsupe.1c6ajga%40ifi.uio.no
&gt;
&gt;     module A : sig
&gt;                  type t = Leaf of string | Node of ASet.t
&gt;                  val compare: t -&gt; t -&gt; int
&gt;                end
&gt;              = struct
&gt;                  type t = Leaf of string | Node of ASet.t
&gt;                  let compare t1 t2 =
&gt;                    match (t1, t2) with
&gt;                      (Leaf s1, Leaf s2) -&gt; Pervasives.compare s1 s2
&gt;                    | (Leaf _, Node _) -&gt; 1
&gt;                    | (Node _, Leaf _) -&gt; -1
&gt;                    | (Node n1, Node n2) -&gt; ASet.compare n1 n2
&gt;                end
&gt;     and ASet : Set.S with type elt = A.t
&gt;              = Set.Make(A)
&gt;
&gt; (BTW, that example doesn't yet work in 3.07-2 default toplevel. And couldn't
&gt; one write "let compare = Pervasives.compare" above? )

 module rec A : (* a forgotten "rec" inserted *)
    sig
      type t = Leaf of string | Node of ASet.t
      val compare: t -&gt; t -&gt; int
    end
    = struct
      type t = Leaf of string | Node of ASet.t
      let compare t1 t2 =
        match (t1, t2) with
          (Leaf s1, Leaf s2) -&gt; Pervasives.compare s1 s2
        | (Leaf _, Node _) -&gt; 1
        | (Node _, Leaf _) -&gt; -1
        | (Node n1, Node n2) -&gt; ASet.compare n1 n2
    end
and ASet : Set.S with type elt = A.t
      = Set.Make(A)

It's a simple syntax error. And, if we use Pervasives.compare, we don't know
for sure how the Leaf &lt;-&gt; Node comparison will work, do we? What if it's
dependent on the order of occurrence of those constructors in the type
definition?

Functors can be heavy, but I prefer that approach too. Having a bit of
recursiveness in the module language makes them much nicer. Now if we can
just get generics...

-- Brian


-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners

</contents>

</message>

