[Haskell-beginners] Data.Map: fromList

Brandon Allbery allbery.b at gmail.com
Tue Sep 11 19:48:51 CEST 2012


On Tue, Sep 11, 2012 at 12:59 PM, Stayvoid <stayvoid at gmail.com> wrote:

> ghci> Map.fromList
> [("betty","555-2938"),("bonnie","452-2928"),("lucille","205-2928")]
> fromList
> [("betty","555-2938"),("bonnie","452-2928"),("lucille","205-2928")]
>
> Why does Map.fromList represent its output like this?
>

It doesn't; the Show instance for Data.Map, however, does a toAscList and
then wraps the resulting list in a fromList, because the internals of a Map
are deliberately hidden.

If the internals of Map were visible, it would be possible to build an
invalid Map; at best it would be unbalanced and slow, at worst it would be
misordered and keys would randomly go "missing" as a result.  See, for
example, how (Map Double a) misbehaves (try searching the haskell-cafe list
for "Map Double"):  the poorly defined Ord constraint on floating point
types, especially in the presence of NaN, means keys *do* sometimes go
missing in this case and (Map Double a) ends up being rather unreliable.

This also means you can break a Map by providing an incorrect or
inconsistent Ord instance for its key.  This is why typeclass instances are
global; if there were local instances, you could do severe violence to a
Map by providing an incompatible/incoherent local Ord instance for the type
of its key.

data Map.Map k a
>   = Data.Map.Tip
>   | Data.Map.Bin !Data.Map.Size !k a !(Map.Map k a) !(Map.Map k a)
>

A node in a Map is either a Tip (placeholder of sorts) or a Bin comprising
a strict number of subnodes/values, a strict key and its associated value,
and strict left and right subtrees (which may be Tip-s if this is a leaf).
 You should never try to work with this directly (and under normal
circumstances you can't, as the constructors are hidden), as outlined above.

-- 
brandon s allbery                                      allbery.b at gmail.com
wandering unix systems administrator (available)     (412) 475-9364 vm/sms
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/beginners/attachments/20120911/996f62e8/attachment-0001.htm>


More information about the Beginners mailing list