From: luc.maranget@inria.fr
To: Dmitry Bely <dmitry.bely@gmail.com>
Cc: caml-list@inria.fr
Subject: Re: [Caml-list] Comparing variant types
Date: Fri, 29 Apr 2011 11:33:55 +0200 [thread overview]
Message-ID: <20110429093355.GA25892@yquem.inria.fr> (raw)
In-Reply-To: <164004794.892685.1304067487325.JavaMail.root@zmbs2.inria.fr>
> > (* performs a simple comparison *)
> > let f a = a <> Right
> >
> > (* calls out to C to do compare_val *)
> > let g (a:dir) b = a <> b
> >
...
>
> let g (a:dir) b = a != b
>
> - Dmitry Bely
>
As a general rule, don't do that! :) (using <> or !=
for writing 'g').
For <>, you'll get hurt by data types with non-unique representation
(such as Set), as already pointed out.
It is ok to use structural equality when it is not the case, but
your programm is not as robust as you may want it to be.
For !=, it is much worse, as soon as you add a non-constant
constructor to your data type, your code is wrong
(cf. [1] != [1])
If you aim at robust code. A recommended (tiresome) alternative
is to write your own equality function once for all, in
the following style.
type dir = Left | Right | Up | Down | No_op
let dir_equal d1 d2 = match d1,d2 with
| (Left, Left)
| (Right,Right)
| (Up, Up)
| (Down,Down)
| (No_op,No_op)
-> true
| (Left,(Right|Up|Down|No_op))
| (Right,(Left|Up|Down|No_op))
| (Up,(Left|Right|Down|No_op))
| (Down,(Left|Right|Up|No_op))
| (No_op,(Down|Up|Right|Left))
-> false
let g a b = not (dir_equal a b)
Notice that 'let f a = a != Right' and 'let f a = a <> Right' are
less dangerous, but well...
--Luc
next prev parent reply other threads:[~2011-04-29 9:34 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-04-28 19:16 Ethan Burns
2011-04-28 21:07 ` Vincent Aravantinos
2011-04-28 22:56 ` Ethan Burns
[not found] ` <354087020.772283.1304031467793.JavaMail.root@zmbs4.inria.fr>
2011-04-29 8:46 ` Fabrice Le Fessant
2011-04-29 8:57 ` Dmitry Bely
[not found] ` <164004794.892685.1304067487325.JavaMail.root@zmbs2.inria.fr>
2011-04-29 9:33 ` luc.maranget [this message]
2011-04-29 10:54 ` Andrew
2011-04-29 11:17 ` Dmitry Bely
2011-04-29 12:15 ` Jon Harrop
2011-04-30 16:38 ` Andrew
2011-04-29 11:32 ` Dmitry Bely
2011-04-30 13:43 ` craff73
2011-04-30 19:26 ` Andrew
2011-04-30 20:19 ` Gabriel Scherer
2011-04-30 20:57 ` Yaron Minsky
[not found] <fa.FGXk5PCsQgS8TidmFkgljpqbLZo@ifi.uio.no>
2011-04-29 11:54 ` Ethan Burns
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=20110429093355.GA25892@yquem.inria.fr \
--to=luc.maranget@inria.fr \
--cc=caml-list@inria.fr \
--cc=dmitry.bely@gmail.com \
/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