<div>key x= unsafePerformIO $ makeStableName x >>= return . hashStableName </div><div><br></div><div>sorry<br><br><div class="gmail_quote">2009/9/10 Alberto G. Corona <span dir="ltr"><<a href="mailto:agocorona@gmail.com">agocorona@gmail.com</a>></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 -> 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"><<a href="mailto:mf-hcafe-15c311f0c@etc-network.de" target="_blank">mf-hcafe-15c311f0c@etc-network.de</a>></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>
> To: <a href="mailto:haskell-cafe@haskell.org" target="_blank">haskell-cafe@haskell.org</a><br>
> From: staafmeister <<a href="mailto:g.c.stavenga@uu.nl" target="_blank">g.c.stavenga@uu.nl</a>><br>
> Date: Thu, 10 Sep 2009 05:23:26 -0700 (PDT)<br>
> Subject: Re: Re[Haskell-cafe] [2]: memoization<br>
<div>><br>
><br>
><br>
> Hi Bulat,<br>
><br>
><br>
> Bulat Ziganshin-2 wrote:<br>
> ><br>
> > Hello staafmeister,<br>
> ><br>
> > Thursday, September 10, 2009, 3:54:34 PM, you wrote:<br>
> ><br>
> >> What do you think about such a function? This function is<br>
> ><br>
> > a bit of refactoring<br>
> ><br>
> > -- "global variable" in haskell way<br>
> > cache = unsafePerformIO $ newIORef M.empty<br>
> ><br>
> > memo f x = unsafePerformIO$ do<br>
> > m <- readIORef cache<br>
> > case M.lookup x m of<br>
> > Just y -> return y<br>
> > Nothing -> do let res = f x<br>
> > writeIORef cache $ M.insert x res m<br>
> > return res<br>
> ><br>
> > memo2 = curry . memo . uncurry<br>
> ><br>
><br>
> This doesn't work and is exactly what I'm afraid the compiler is going to<br>
> do. Cache needs to<br>
> be associated with the function f.<br>
><br>
> 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 <- readIORef cache<br>
</div> case M.lookup (mkKey f, x) m of<br>
<div> Just y -> return y<br>
Nothing -> 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'd<br>
have to hack something together yourself. Perhaps an explicit<br>
argument to memo?<br>
<br>
memo :: (Ord a) => String -> (a -> b) -> a -> IO b<br>
memo fname f x = unsafePerformIO$ do<br>
m <- readIORef cache<br>
case M.lookup (fname, x) m of<br>
<div> Just y -> return y<br>
Nothing -> 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>