[Haskell-cafe] Efficient object identity (aka symbols as data)
Jacek Generowicz
Jacek.Generowicz at cern.ch
Thu May 26 11:41:04 CEST 2011
On 2011 May 26, at 11:12, Brandon Allbery wrote:
> On Thu, May 26, 2011 at 04:45, Jacek Generowicz <jacek.generowicz at cern.ch
> > wrote:
> What is the Haskell approach to efficient comparison and lookup of
> objects by their identity?
>
> ghc uses Data.Unique to generate unique internal identifiers to
> associate with things.
At first blush it sounds like the sort of thing I'm after. Thanks.
> (Think gensym. Hm, except last time I did anything serious with
> Lisp, it was Maclisp... does gensym even still exist, or did CL do
> something inscrutable with it?)
CL has gensym.
But gensym does seem to be overkill in the case I presented.
I *could*, for example, say
data Person = Fred | Johnny | Sally | Belinda | Kate | Roger | Eric
[... and so on for a few squillion ...]
data Group = Amazing | Brilliant | Cool | Great | Funky [ ... and so
on for a few dozen ...]
preferences :: Map Person (Group, Group, Group)
In this setup (Fred == Johnny) will be very cheap, and (lookup Fred
preferences) will be less cheap but possible.
I'd use gensym if I need a new symbol right about which I know nothing
other than I want it to be new and unique (nobody has created it
before, and nobody will in the future). In the example scenario, I
know what I want the symbol is to be called, and am prepared to accept
the responsibility for avoiding duplicates, but I still want to be
able create it at run time. In the Haskell snippet above, the compiler
protects me against duplication, but forces me to know the data at
compile time.
In Lisp terms, I'm looking for make-symbol and intern.
> Beyond that, the existence of functions such as
> reallyUnsafePointerEquality# makes me think it's a Hard Problem.
:-)
More information about the Haskell-Cafe
mailing list