
On Mon, Jan 17, 2005 at 08:38:12AM +0100, Ketil Malde wrote:
Sven Panne
writes: I must admit that I didn't follow the data structure discussion in every detail, but I find something confusing: In Data.FiniteMap.addListToFM_C, the combining function gets the old value as the 1st argument and the new value as the 2nd one. In Data.Map.insertWithKey (and friends), this seems to be the other way round, which is undocumented and *very* confusing when trying to port things from FiniteMap to Map. Is there a deep reason for this?
Hmmm...I have perhaps a rather shallow reason. When using a FiniteMap to collect lists of values, I think it will be more efficient to use (flip (++)), prepending instead of appending each new element.
If (flip (++)) is efficient for one interface, shouldn't (++) be as efficient for the other? Why not use efficient catenable sequences or a ShowS trick, like here: groupFM :: Ord a => [(a, b)] -> FiniteMap a [b] groupFM l = mapFM (\_ -> ($ [])) $ addListToFM_C (.) emptyFM [ (a, (b:)) | (a, b) <- l ] PS. If anyone asks, I am strongly against introducing such artificial differences in library interfaces. Best regards, Tomasz