ANN: bytestring-trie 0.2.3

wren ng thornton wren at
Sat Feb 12 12:47:39 CET 2011

-- bytestring-trie 0.2.3

A long-awaited release for efficient finite maps from (byte)strings to 
values. This version adds a number of new functions for taking advantage 
of the trie structure.

At the Haskell Symposium 2010, Milan Straka presented a wonderful paper 
comparing the state of the @containers@ library pre-GHC7. In it he 
compared the new @hashmap@ against the buggy old @bytestring-trie@ 0.1.4 
(the major bug was fixed in 0.2.2 released 2010-06-10), and I've been 
meaning to update the package ever since. I haven't had a chance to do 
an extensive performance analysis yet, but it's worth clearing up some 
misconceptions--- which is what this release is all about.

If you are only interested in being able to associate strings to values, 
then you may prefer the @hashmap@ package which is faster for those only 
needing a map-like structure. This package is intended for those who 
need the extra capabilities that a trie-like structure can offer (e.g., 
structure sharing to reduce memory costs for highly redundant keys, 
taking the submap of all keys with a given prefix, contextual mapping, 
extracting the minimum and maximum keys, etc.)

While hacking on another project I noticed that @bytestring-trie@ didn't 
actually export many functions taking advantage of the trie structure. 
So let's fix that!

-- Changes (available in 0.2.2, but not announced previously)

* Added some functions for treating tries like priority queues 
(minAssoc, maxAssoc, updateMinViewBy, updateMaxViewBy). Currently these 
are only exported by Data.Trie.Internal though future releases may 
re-export them from Data.Trie too.

-- Changes (since 0.2.2)

* Added Data.Trie.Internal.alterBy_: A variant of 'alterBy' which also 
allows modifying the sub-trie. This is useful for cases where you want 
to alter a number of values which are each prefixes of one another 
(e.g., "a", "ab", "abc",...).

* Added a number of "contextual" mapping functions (contextualMap, 
contextualMap', contextualFilterMap, contextualMapBy) which give access 
to the sub-trie rooted at each value. Currently these are only exported 
by Data.Trie.Internal though future releases may re-export them from 
Data.Trie too.

* Added strict variants of a number of functions in 
Data.Trie.Convenience (fromListWith', insertWith', insertWithKey', 

* Added some additional functions for building tries from association 
lists (fromListWith', fromListWithL, fromListWithL') as suggested by Ian 

* Converted the definitions for fmap, foldMap, traverse, and filterMap 
to use the worker/wrapper transform. This appears to be an optimization, 
though I don't have a decent benchmarking suite for verifying this.

* Lots of tweaks and improvements to the documentation.

-- Future work

* I'm still not leased with the situation of having so many different 
variants of fromList. There must be a nicer solution which generalizes 
over all of them and doesn't have the various pessimal corner cases...

* The priority queue functions still need some work to make them general 
as well as comprehensive like the other functions in Data.Trie.Internal 

* I still need to do a thorough performance analysis. The code for 
Data.Trie was based very closely on the code for Data.IntMap. Milan 
Straka found a number of ways to optimize the Data.IntMap code, so I 
need to incorporate those into the Data.Trie code.

-- Links




Haddock (Darcs version):

Live well,

More information about the Libraries mailing list