Hi,
I have a problem in GHC 6.10 with functions in a class instance calling
other functions in the same class instance. It seems that the dictionary
is freshly constructed for this call, despite being already available.
The reason I care is that I want to memoise some expensive computations
inside the dictionary for each instance. [Obviously I also have to make
sure that the dictionary isn't constructed multiple times by external
callers, but I can make other arrangements to ensure that.]
To see the problem in action, run main from the attached code. In GHC 6.8
and before, this only executes the trace statement once. In GHC 6.10, the
trace statement executes twice, at all optimisation levels.
This seems related to
http://hackage.haskell.org/trac/ghc/ticket/2902, but I'm a little unclear
on whether it's the same problem or not.
Cheers,
Ganesh
{-# LANGUAGE ScopedTypeVariables #-}
module RecDict where
import Debug.Trace
class Foo a where
tname :: a -> String
mem1 :: a -> Int
mem2 :: a -> Int
mem2 = let opt = trace ("Ouch! Imagine this is really expensive! Called for " ++ tname (undefined :: a)) (2 * mem1 (undefined :: a))
in \a -> opt
mem3 :: a -> Int
instance Foo () where
tname _ = "()"
mem1 _ = 0
mem3 _ = 0
data T a = T a
instance Foo a => Foo (T a) where
tname ~(T a) = "T (" ++ tname a ++ ")"
mem1 ~(T a) = 1 + mem1 a
mem3 a = 1 + mem2 a
add :: Foo a => a -> Int
add a = mem2 a + mem3 a
main = print $ add (T ())
_______________________________________________
Glasgow-haskell-users mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/glasgow-haskell-users