The whole ANN mechanism is, at root, a good idea. It is pretty generan, and allows annotations to be arbitrary expressions, provided they are in Typable and Data.  And they are serialised across modules.

In practice though, I'm not sure how widely used they are. I'm not sure why. I'd love to hear of counter-examples.

Only top level binders can be annotated; but there is no reason in principle that you should not annotate instance declarations.  I don't think it'd be too hard to implement.

Simon

On Sat, 2 Dec 2023 at 14:51, Jaro Reinders <jaro.reinders@gmail.com> wrote:
Hi GHC devs,

I'm working on a GHC plugin which implements a custom instance resolution
mechanism:

https://github.com/noughtmare/transitive-constraint-plugin

Currently, I need to place instances in a specific order in a specific file to
recognize them and use them in my plugin. I think my life would be a lot easier
if I could put annotations on instances. I imagine a syntax like this:

     data MyInstanceTypes = Refl | Trans deriving Eq

     class f <= g where
       inj :: f x -> g x

     instance {-# ANN instance Refl #-} f <= f where
       inj = id

     instance {-# ANN instance Trans #-}
         forall f g h. (f <= g, g <= h) => f <= h
       where
         inj = inj @g @h . inj @f @g

Using this information I should be able to find the right instances in a more
reliable way.

One more thing I was thinking about is to make it possible to remove these
instances from the normal resolution algorithm and only allow them to be used
by my plugin.

Do you think this would be easy to implement and useful? Or are there other
ways to achieve this?

Cheers,

Jaro
_______________________________________________
ghc-devs mailing list
ghc-devs@haskell.org
http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs