key x= unsafePerformIO $ makeStableName x >>= return . hashStableName
sorry 2009/9/10 Alberto G. Corona <agocor...@gmail.com> > instead o that you can use a key such is: > key :: a -> Int > key = unsafePerformIO . hashStableName . makeStableName > > that is defined for any kind of data > > then, a unique key for the pair f x could be: > > key1 f x=(key f , key x) > > > However my experience is that ocassionally gives different hashes for the > same object, so maybe a few registers will be duplicated. > > > > 2009/9/10 <mf-hcafe-15c311...@etc-network.de> > > >> On Thu, Sep 10, 2009 at 05:23:26AM -0700, staafmeister wrote: >> > To: haskell-cafe@haskell.org >> > From: staafmeister <g.c.stave...@uu.nl> >> > Date: Thu, 10 Sep 2009 05:23:26 -0700 (PDT) >> > Subject: Re: Re[Haskell-cafe] [2]: memoization >> > >> > >> > >> > Hi Bulat, >> > >> > >> > Bulat Ziganshin-2 wrote: >> > > >> > > Hello staafmeister, >> > > >> > > Thursday, September 10, 2009, 3:54:34 PM, you wrote: >> > > >> > >> What do you think about such a function? This function is >> > > >> > > a bit of refactoring >> > > >> > > -- "global variable" in haskell way >> > > cache = unsafePerformIO $ newIORef M.empty >> > > >> > > memo f x = unsafePerformIO$ do >> > > m <- readIORef cache >> > > case M.lookup x m of >> > > Just y -> return y >> > > Nothing -> do let res = f x >> > > writeIORef cache $ M.insert x >> res m >> > > return res >> > > >> > > memo2 = curry . memo . uncurry >> > > >> > >> > This doesn't work and is exactly what I'm afraid the compiler is going >> to >> > do. Cache needs to >> > be associated with the function f. >> > >> > Otherwise one would get conflicts >> >> then make the cache object store functions together with values. >> >> >> cache = unsafePerformIO $ newIORef M.empty >> >> memo f x = unsafePerformIO$ do >> m <- readIORef cache >> case M.lookup (mkKey f, x) m of >> Just y -> return y >> Nothing -> do let res = f x >> writeIORef cache $ M.insert (mkKey >> f, x) res m >> return res >> >> memo2 = curry . memo . uncurry >> >> This leaves mkKey. Since functions are neither Ord nor Show, you'd >> have to hack something together yourself. Perhaps an explicit >> argument to memo? >> >> memo :: (Ord a) => String -> (a -> b) -> a -> IO b >> memo fname f x = unsafePerformIO$ do >> m <- readIORef cache >> case M.lookup (fname, x) m of >> Just y -> return y >> Nothing -> do let res = f x >> writeIORef cache $ M.insert (fname, >> x) res m >> return res >> >> there is probably a better and more elegant solution, but this should >> at least work. right? >> >> >> matthias >> _______________________________________________ >> Haskell-Cafe mailing list >> Haskell-Cafe@haskell.org >> http://www.haskell.org/mailman/listinfo/haskell-cafe >> > > >
_______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe