<div dir="ltr">On Tue, Sep 11, 2012 at 12:59 PM, Stayvoid <span dir="ltr">&lt;<a href="mailto:stayvoid@gmail.com" target="_blank">stayvoid@gmail.com</a>&gt;</span> wrote:<br><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
ghci&gt; Map.fromList<br>
[(&quot;betty&quot;,&quot;555-2938&quot;),(&quot;bonnie&quot;,&quot;452-2928&quot;),(&quot;lucille&quot;,&quot;205-2928&quot;)]<br>
fromList [(&quot;betty&quot;,&quot;555-2938&quot;),(&quot;bonnie&quot;,&quot;452-2928&quot;),(&quot;lucille&quot;,&quot;205-2928&quot;)]<br>
<br>
Why does Map.fromList represent its output like this?<br></blockquote><div><br></div><div>It doesn&#39;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.</div>
<div><br></div><div>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 &quot;missing&quot; as a result.  See, for example, how (Map Double a) misbehaves (try searching the haskell-cafe list for &quot;Map Double&quot;):  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. </div>
<div><br></div><div>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.</div>
<div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">data Map.Map k a<br>
  = Data.Map.Tip<br>
  | Data.Map.Bin !Data.Map.Size !k a !(Map.Map k a) !(Map.Map k a)<br></blockquote><div><br></div><div>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&#39;t, as the constructors are hidden), as outlined above.</div>
<div><br></div></div>-- <br>brandon s allbery                                      <a href="mailto:allbery.b@gmail.com" target="_blank">allbery.b@gmail.com</a><br>wandering unix systems administrator (available)     (412) 475-9364 vm/sms<br>
<br>
</div>