I say "usually" because while I believe this to be true for the current implementation of GHC, I don't think we necessary give this operational guarantee.
But yes, your real problem is that there is a world of difference between functions and non-functions. You will need to use one of the usual tricks for memoising functions, or forgo using a function altogether and lean on laziness. Edward Excerpts from Jonas Almström Duregård's message of Fri Jun 29 11:21:46 -0400 2012: > Thank you for your response Edward, > > You write that it is usually only evaluated once, do you know the > circumstances under which it is evaluated more than once? I have some > examples of this but they are all very large. > > The real issue I was having was actually not with a list but with a > memoised function i.e. something like: > >>> > class C a where > memoised :: Int -> a > <<< > > Perhaps functions are treated differently? > > Regards, > Jonas > > On 29 June 2012 15:55, Edward Z. Yang <ezy...@mit.edu> wrote: > > Hello Jonas, > > > > Like other top-level definitions, these instances are considered CAFs > > (constant applicative forms), so these instances will in fact usually > > be evaluated only once per type X. > > > > import System.IO.Unsafe > > class C a where > > dflt :: a > > instance C Int where > > dflt = unsafePerformIO (putStrLn "bang" >> return 2) > > main = do > > print (dflt :: Int) > > print (dflt :: Int) > > print (dflt :: Int) > > > > ezyang@javelin:~/Dev/haskell$ ./caf > > bang > > 2 > > 2 > > 2 > > > > Cheers, > > Edward > > > > Excerpts from Jonas Almström Duregård's message of Fri Jun 29 07:25:42 > > -0400 2012: > >> Hi, > >> > >> Is there a way to ensure that functions in a class instance are > >> treated as top level definitions and not re-evaluated? > >> > >> For instance if I have this: > >> >>> > >> class C a where > >> list :: [a] > >> > >> instance List a => List [a] where > >> list = permutations list > >> <<< > >> How can I ensure that list :: [[X]] is evaluated at most once for any > >> type X (throughout my program)? > >> > >> I assume this is potentially harmful, since list can never be garbage > >> collected and there may exist an unbounded number of X's. > >> > >> I currently have a solution that uses Typeable to memoise the result > >> of the function based on its type. Is there an easier way? > >> > >> Regards, > >> Jonas > >> _______________________________________________ Glasgow-haskell-users mailing list Glasgow-haskell-users@haskell.org http://www.haskell.org/mailman/listinfo/glasgow-haskell-users