FiniteMap: modifyFM

Jon Fairbairn Jon.Fairbairn@cl.cam.ac.uk
Sat, 15 Jun 2002 11:13:34 +0100


I'm using a FiniteMap with fairly long keys; I need to
change the value associated with a key fairly often. =


The current definition of addToFM looks like this:


addToFM fm key elt =3D addToFM_C (\ old new -> new) fm key elt

addToFM_C combiner EmptyFM key elt =3D unitFM key elt
addToFM_C combiner (Branch key elt size fm_l fm_r) new_key new_elt
  | new_key < key =3D mkBalBranch key =

                                elt =

                                (addToFM_C combiner fm_l new_key new_elt)=

                                fm_r
  | new_key > key =3D mkBalBranch key
                                elt
                                fm_l
                                (addToFM_C combiner fm_r new_key new_elt)=

  | otherwise	  =3D Branch new_key
                           (combiner elt new_elt)
                           size =

                           fm_l =

                           fm_r

(Or at least I wish it did -- the #ifs and lines > 80 chars
make it hard [for me at least] to read).

Now, in the case where equality from Ord key is an
equivalence rather than true equality, I can see that using
"new_key" in the otherwise case is the right thing to do.

For my case, it means that the recently allocated new_key
replaces the old key that will have been around
longer. Doesn't this interact badly with generational
collectors? =


Oh yes, and since the similar operations on Refs and states
are called modifyBlah, shouldn't the _C versions of
operations on FiniteMaps be called something with "modify"
in them?

so addToFM_C would become modifyFM
   addListToFM_C ----"--- listModifyFM

etc. I think names with words rather than abbreviations are
easier to read when returning to something after a long
period of absence.

  J=F3n


-- =

J=F3n Fairbairn                                 Jon.Fairbairn@cl.cam.ac.u=
k
31 Chalmers Road                                         jf@cl.cam.ac.uk
Cambridge CB1 3SZ            +44 1223 570179 (after 14:00 only, please!)