caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
From: Jacques Garrigue <garrigue@kurims.kyoto-u.ac.jp>
To: oleg_trott@columbia.edu
Cc: caml-list@inria.fr
Subject: Re: [Caml-list] Strange physical equality behavior
Date: Mon, 10 Nov 2003 17:29:24 +0900	[thread overview]
Message-ID: <20031110172924V.garrigue@kurims.kyoto-u.ac.jp> (raw)
In-Reply-To: <200311092125.36771.oleg_trott@columbia.edu>

From: Oleg Trott <oleg_trott@columbia.edu>

> So returning "true" for "sin == sin" and "sin = sin" wouldn't break
> the above guarantee.

Of course.
And returning true for "sin = (fun x -> cos (x -. acos (-1.) /. 2))"
wouldn't break it either.
The specification is just designed to avoid having to do that: to
allow the compiler to choose the most efficient runtime
representation. It might actually just return "false" when you compare
any two functions, but even this would require some more computation.

> Here are my reasons for wanting such behavior (not just for "sin" of course, 
> but also "(+)" , etc., and especially for "compare"):
> 
> As was discussed lately [1], the functorial interfaces (as used in the 
> standard library) are somewhat clumsy. One solution could be to pass the 
> necessary ordering and hashing functions as optional parameters to "emtpy" or 
> "create". However, in this case, functions would need to be compared at 
> runtime
> 
> compare_functions f g = try f = g with _ -> false
> 
> So e.g. "compare == compare" returning true would be a lot more convenient

The problem is that compare has several implementations, depending on
the type of its argument, to be more efficient. One may imagine tricks
to make sure that any one of these implementations is shared between
all its occurences (but even this may be complicated while keeping
inlining). But generic compare cannot be equal to float compare, while
they are just separated by their types.

The functorial approach offers a much cleaner solution.
Alternatively, you can think of a system of registered comparison
functions:
  type 'a comparison = {id: int; compare: 'a -> 'a -> int}
  let count = ref 0
  let make_compare f = incr count; {id = !count; compare = f}
  let same f1 f2 = (f1.id = f2.id)
If comparison is kept abstract, you can then safely check for
equality.
A lighter way would be to combine this registration with the "empty"
function: two sets can be combined if they were created from the same
empty set.

The last solution is not to bother about that: I'm yet to see code
mixing two sets of the same type but with different comparison
functions. Sounds silly.

Jacques Garrigue

-------------------
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


  reply	other threads:[~2003-11-10  8:29 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2003-11-09 18:34 Oleg Trott
2003-11-10  1:33 ` Jacques Garrigue
2003-11-10  2:25   ` Oleg Trott
2003-11-10  8:29     ` Jacques Garrigue [this message]
2003-11-10 18:41       ` Michal Moskal
2003-11-11  1:35         ` Jacques Garrigue
2003-11-11  6:48   ` Oleg Trott
2003-11-11 16:46     ` David Brown
2003-11-12  0:32       ` William Lovas
2003-11-11 17:08     ` brogoff

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=20031110172924V.garrigue@kurims.kyoto-u.ac.jp \
    --to=garrigue@kurims.kyoto-u.ac.jp \
    --cc=caml-list@inria.fr \
    --cc=oleg_trott@columbia.edu \
    /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).