Hi Adam, Thakns for the pointer. Adding the type variable indeed seems to solve the problem. Greatly appreciated!
Best, Sandy On Sat, 2023-02-04 at 12:49 +0000, Adam Gundry wrote: > Hi Sandy, > > I don't think you can easily prevent GHC from caching solutions to > specific constraints, and even if you could, the simplifier feels > free > to common-up dictionaries with the same type and hence would > potentially > introduce unintended semantic changes to the program. > > You might be able to address at least the second issue by using > implicit > parameters instead. But I think a more robust approach would be to > introduce an extra type parameter: > > class KnownAnnotations a where > rawAnnotationsVal :: [Annotation] > > Now each rawAnnotationsVal call site will introduce a fresh > unification > variable α and the wanted constraint `KnownAnnotations α`. Your > plugin > can spot this constraint and solve it, while leaving α > uninstantiated. > Hence each call site will have a different constraint type, and the > problems should go away. > > Perhaps you could even make the parameter invisible/inferred, so it > wouldn't change the user-visible API. Something like this might work, > but I haven't tested it: > > type KnownAnnotations :: forall {a} . Constraint > class KnownAnnotations where > rawAnnotationsVal :: [Annotation] > > Hope this helps, > > Adam > > > > On 04/02/2023 09:29, Sandy Maguire via ghc-devs wrote: > > Hi all, > > > > I'm working on a little TC plugin that solves the following class: > > > > ```haskell > > class KnownAnnotations where > > rawAnnotationsVal :: [Annotation] > > ``` > > > > Like `HasCallStack`, the result of `KnownAnnotations` is unique to > > each > > callsite. Thus, I am trying to prevent my TC plugin from adding the > > solved constraint to the inert set. > > > > As an example, the following program: > > > > ``` > > t2 :: ([Annotation], Int) > > t2 = (rawAnnotationsVal, test2) > > > > t3 :: ([Annotation], Int) > > t3 = (rawAnnotationsVal, test3) > > ``` > > > > dumps this output with `-ddump-cs-trace`: > > > > ``` > > > > Step 1[l:0,d:0] Kept as inert: > > [WD] $dKnownAnnotations_a18UB {0}:: KnownAnnotations > > Step 2[l:0,d:0] Dict equal (keep inert): > > [WD] $dKnownAnnotations_a18UD {0}:: KnownAnnotations > > ``` > > > > Is there some trick to prevent the inert caching for these solved > > wanteds? > > > > Cheers, > > Sandy > >
signature.asc
Description: This is a digitally signed message part
_______________________________________________ ghc-devs mailing list ghc-devs@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs