Я пишу символический механизм выполнения для 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
имеет уникальный идентификатор rrZ
.В HsBind
определения экземпляра есть следующие пары varName-varUnique:
- На верхнем уровне
AbsBind
: - во вложенном
AbsBind
Поскольку ни один из них не совпадает с местом вызова, я прибег к косвенному методу сопоставления типа на месте вызова со всеми типами с одинаковыми именами, но для этого требуется написать отдельную логику для экземпляров.из функций верхнего уровня.Есть ли единый способ найти реализацию какой-то функции?