GHC API: поиск реализаций функций экземпляра - PullRequest
4 голосов
/ 21 сентября 2019

Я пишу символический механизм выполнения для Haskell, используя GHC, и часто мне нужно найти в программе реализации instance различных функций.Однако после просмотра множества AST, созданных средством проверки типов, я не вижу возможности связать вызов функции с ее реализацией в блоке instance.AST не имеет информации, чтобы поддержать очевидное решение соответствия клавиш Unique.В отличие от определений функций верхнего уровня, ни один из Unique s в привязке функции экземпляра не соответствует Unique места вызова.Например, в этой простой программе:

module M where
  class A a where
    foo :: a b -> b

  newtype Box a = Box a
  instance A Box where
    foo (Box a) = a

  bar = foo (Box ())

в теле bar, foo имеет уникальный идентификатор rrZHsBind определения экземпляра есть следующие пары varName-varUnique:

  • На верхнем уровне AbsBind:
    • $cfoo: a1dd
    • foo: a1de
  • во вложенном AbsBind
    • foo: a1dg

Поскольку ни один из них не совпадает с местом вызова, я прибег к косвенному методу сопоставления типа на месте вызова со всеми типами с одинаковыми именами, но для этого требуется написать отдельную логику для экземпляров.из функций верхнего уровня.Есть ли единый способ найти реализацию какой-то функции?

...