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