On Wed, Aug 12, 2009 at 12:07 PM, John Van Enk<vane...@gmail.com> wrote:
> On Wed, Aug 12, 2009 at 11:34 AM, David Menendez<d...@zednenem.com> wrote:
>> On Wed, Aug 12, 2009 at 9:16 AM, John Van Enk<vane...@gmail.com> wrote:
>>> On Wed, Aug 12, 2009 at 2:09 AM, Ketil Malde<ke...@malde.org> wrote:
>>>>
>>>> And perhaps also note that you will get exceptions for values outside
>>>> the Enum range.
>>>>
>>>
>>> I'd think that part is obvious.
>>
>> That depends on what "outside the Enum range" means. You'll get an
>> exception if you somehow get an Int key in the map which doesn't
>> correspond to any value in the enum...
>
> We should be protected by the type system against unmatched Int's in
> the map as long as you have sane Enum instances.

One would hope so.

>> ... but you don't get an exception if
>> you try to pass in, say, a large Integer.
>> Prelude> fromEnum (2^32)
>> 0
>>
>> In essence, you're using Enum as a hash function, but not making any
>> provision for hash collisions.
>>
>
> Unless I'm mistaken, the Enum typeclass _is_ a hash function who's
> keyspace is the range of Int that doesn't make any provisions for
> collisions.

Hash functions traditionally map integers to integers, so I would
describe fromEnum as "like" a hash function, but that's not important.

And yes, hash functions collide, which is why hash tables employ
various methods for distinguishing keys that hash to the same values.
EnumMap silently passes this responsibility to the user, without even
a note in the documentation.

-- 
Dave Menendez <d...@zednenem.com>
<http://www.eyrie.org/~zednenem/>
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to