Шаблон Haskell уже предоставляет функцию , которая делает почти то, что вы хотите. Он существует начиная с версии 2.5, и до этого я не знал о каких-либо средствах поиска экземпляров.
Разница в том, что существующая функция isClassInstance
принимает Name
для класса - это то, что вы получаете от чего-то вроде ''Read
- но Type
для поиска экземпляров. Это, вероятно, имеет больше смысла, потому что с Name
нет очевидного способа проверить экземпляры, которые требуют параметров типа. Например, вы не сможете напрямую проверить, имеет ли [Int]
экземпляр Show
или Either String
является экземпляром Monad
.
Обратите внимание, что Type
можно построить почти так же легко, как Name
, используя цитату, например, Вы могли бы написать что-то вроде $(isInstanceOf ''Monad [t| Either String |])
.
Учитывая вышесказанное, все, что вам нужно сделать, это немного жонглировать, чтобы получить полезное значение из соединения, каким бы вы ни хотели, чтобы оно было.