<div>key x=  unsafePerformIO $    makeStableName  x &gt;&gt;= return . hashStableName </div><div><br></div><div>sorry<br><br><div class="gmail_quote">2009/9/10 Alberto G. Corona <span dir="ltr">&lt;<a href="mailto:agocorona@gmail.com">agocorona@gmail.com</a>&gt;</span><br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;"><div class="gmail_quote">instead o that you can use  a key such is:<div><br></div><div>key :: a -&gt; Int<br><div><div>
<div>key = unsafePerformIO . hashStableName  . makeStableName </div><div><br></div><div>that is defined for any kind of data</div>
<div><br></div><div>then, a unique key for the pair f x could be:</div>
<div><br></div><div>key1 f x=(key f , key x)</div><div><br></div><div><br></div><div>However my experience is that ocassionally gives different hashes for the same object, so maybe a few registers will be duplicated.</div>
<div><div></div><div class="h5">
<div><br></div><div><br></div><br><div class="gmail_quote">2009/9/10  <span dir="ltr">&lt;<a href="mailto:mf-hcafe-15c311f0c@etc-network.de" target="_blank">mf-hcafe-15c311f0c@etc-network.de</a>&gt;</span><div><div></div>

<div><br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><br>
On Thu, Sep 10, 2009 at 05:23:26AM -0700, staafmeister wrote:<br>
&gt; To: <a href="mailto:haskell-cafe@haskell.org" target="_blank">haskell-cafe@haskell.org</a><br>
&gt; From: staafmeister &lt;<a href="mailto:g.c.stavenga@uu.nl" target="_blank">g.c.stavenga@uu.nl</a>&gt;<br>
&gt; Date: Thu, 10 Sep 2009 05:23:26 -0700 (PDT)<br>
&gt; Subject: Re: Re[Haskell-cafe] [2]: memoization<br>
<div>&gt;<br>
&gt;<br>
&gt;<br>
&gt; Hi Bulat,<br>
&gt;<br>
&gt;<br>
&gt; Bulat Ziganshin-2 wrote:<br>
&gt; &gt;<br>
&gt; &gt; Hello staafmeister,<br>
&gt; &gt;<br>
&gt; &gt; Thursday, September 10, 2009, 3:54:34 PM, you wrote:<br>
&gt; &gt;<br>
&gt; &gt;&gt; What do you think about such a function? This function is<br>
&gt; &gt;<br>
&gt; &gt; a bit of refactoring<br>
&gt; &gt;<br>
&gt; &gt; -- &quot;global variable&quot; in haskell way<br>
&gt; &gt; cache = unsafePerformIO $ newIORef M.empty<br>
&gt; &gt;<br>
&gt; &gt; memo f x = unsafePerformIO$ do<br>
&gt; &gt;                        m &lt;- readIORef cache<br>
&gt; &gt;                        case M.lookup x m of<br>
&gt; &gt;                          Just y -&gt; return y<br>
&gt; &gt;                          Nothing -&gt; do let res = f x<br>
&gt; &gt;                                        writeIORef cache $ M.insert x res m<br>
&gt; &gt;                                        return res<br>
&gt; &gt;<br>
&gt; &gt; memo2 = curry . memo . uncurry<br>
&gt; &gt;<br>
&gt;<br>
&gt; This doesn&#39;t work and is exactly what I&#39;m afraid the compiler is going to<br>
&gt; do. Cache needs to<br>
&gt; be associated with the function f.<br>
&gt;<br>
&gt; Otherwise one would get conflicts<br>
<br>
</div>then make the cache object store functions together with values.<br>
<div><br>
<br>
cache = unsafePerformIO $ newIORef M.empty<br>
<br>
memo f x = unsafePerformIO$ do<br>
                       m &lt;- readIORef cache<br>
</div>                       case M.lookup (mkKey f, x) m of<br>
<div>                         Just y -&gt; return y<br>
                         Nothing -&gt; do let res = f x<br>
</div>                                       writeIORef cache $ M.insert (mkKey f, x) res m<br>
<div>                                       return res<br>
<br>
memo2 = curry . memo . uncurry<br>
<br>
</div>This leaves mkKey.  Since functions are neither Ord nor Show, you&#39;d<br>
have to hack something together yourself.  Perhaps an explicit<br>
argument to memo?<br>
<br>
memo :: (Ord a) =&gt; String -&gt; (a -&gt; b) -&gt; a -&gt; IO b<br>
memo fname f x = unsafePerformIO$ do<br>
                       m &lt;- readIORef cache<br>
                       case M.lookup (fname, x) m of<br>
<div>                         Just y -&gt; return y<br>
                         Nothing -&gt; do let res = f x<br>
</div>                                       writeIORef cache $ M.insert (fname, x) res m<br>
                                       return res<br>
<br>
there is probably a better and more elegant solution, but this should<br>
at least work.  right?<br>
<br>
<br>
matthias<br>
<div><div></div><div>_______________________________________________<br>
Haskell-Cafe mailing list<br>
<a href="mailto:Haskell-Cafe@haskell.org" target="_blank">Haskell-Cafe@haskell.org</a><br>
<a href="http://www.haskell.org/mailman/listinfo/haskell-cafe" target="_blank">http://www.haskell.org/mailman/listinfo/haskell-cafe</a><br>
</div></div></blockquote></div></div></div><br></div></div></div></div></div>
</div><br>
</blockquote></div><br></div>