Front page | perl.perl6.language |
Postings from February 2005
Re: Valid hash keys?
Thread Previous
From:
Luke Palmer
Date:
February 27, 2005 15:54
Subject:
Re: Valid hash keys?
Message ID:
20050227235520.GA16945@navi.cx
Nigel Sandever writes:
> On Sun, 27 Feb 2005 15:36:42 -0700, luke@luqui.org (Luke Palmer) wrote:
> > As far as getting 2, 2.0, and "2" to hash to the same object, well, we
> > know they're 'equal', so we just need to know how to hash them the same
> > way. In fact, I don't believe 2.0 can be represented as a Num. At
> > least in Perl 5, it translates itself back to an int. So we can just
> > stringify and hash for the scalar types.
>
> My thought is that if c<my %hash is shape(Any)> uses the stringyfied values of
> the keys, then it is no different to C<my %hash>,
Indeed, but I meant just for our non-reference scalar types, such as
Num, Int, and Str.
> I think it would be useful for shape(Any) be different to an ordinary
> hash, and hashing the binary representation of the key, so that
>
> (Int)2, (Num)2, (String)2, (uint)2 (uint4)2 etc.
>
> would be a useful way of collating things according to their "type"
> rather than their value....?
That may indeed be a useful kind of map to have, but it's hardly what
people expect when they declare a hash keyed by Any. The reason I want
to identify 2 and "2" is because they are identical everywhere else in
the language.
Also, if you hash on the binary representation, what's to say that uint
hashes differently from uint4. And even if we do guarantee that they
hash differently, there will be collisions. And then uint(2) equal
uint4(2) (for any reasonable implementation of equal), and they are the
same, but only for collision values.
A better way to make a type-collated hash would be to:
class TypeHash is Hash[shape => [Class; Any]] {
method postcircumfix:<{ }> (Any $arg) {
.SUPER::{$arg.type; $arg}
}
}
And if you really think that it's going to be that common, then you can
write a module that implements that. It would be about five lines long.
Luke
Thread Previous