[GHC Users] Dictionary sharing

Edward Z. Yang ezyang at MIT.EDU
Fri Jun 29 15:55:36 CEST 2012

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 at javelin:~/Dev/haskell$ ./caf


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

More information about the Glasgow-haskell-users mailing list