WAT: opCmp and opEquals woes
Fool via Digitalmars-d
digitalmars-d at puremagic.com
Sun Jul 27 23:05:01 PDT 2014
On Monday, 28 July 2014 at 00:23:36 UTC, H. S. Teoh via
Digitalmars-d wrote:
> On Sun, Jul 27, 2014 at 07:04:08PM +0000, Fool via
>> Defining opEquals only makes sense if a user wants to replace
>> equality
>> by some equivalence relation (different from equality).
>
> Not necessarily. The user type may be implemented in a way where
> member-wise binary comparison is not the correct implementation
> of
> equality. For example, it could be a tree structure implemented
> by
> integer indices into a backing array of nodes. There is no way
> the
> compiler could know, in general, how to correctly compare two
> instances
> of such a structure, since the bit-level representation of two
> equal
> objects may be completely different, yet they represent
> equivalent
> trees. You're still implementing equality, but it's equality
> that's not
> the same as binary equality.
I think we agree except for a subtle difference in defining
equality and equivalence. In my personal language there is a
single equality but there are many equivalences.
> The problem with imposing these kinds of restrictions, is that
> they are
> generally not enforceable (at least, not without significantly
> crippling
> legitimate use cases). At some point, we have to stop
> babysitting the
> programmer and trust that he's competent enough to not try to
> subvert
> the language to make it do stuff it wasn't intended to do. As
> somebody
> once said:
>
> Unix was not designed to stop people from doing stupid things,
> because that would also stop them from doing clever things.
> -- Doug Gwyn
>
> We're not talking about Unix here, but the same principle
> applies.
I agree.
>> Please excuse my lack of creativity: in presence of opCmp I
>> cannot see
>> a single sensible use case for defining a.opEquals(b)
>> different from
>> a.opCmp(b) == 0.
>
> Floating-point numbers? ;-)
Thank you for pushing me there! It's true.
So D has to separate opEquals and opCmp since otherwise a user
could not define floating-point 'equality' and 'comparison'
himself in the same way as it is defined by the language.
I'm convinced know. :-)
Thanks!
More information about the Digitalmars-d
mailing list