Haskell: Как определить, является ли тип экземпляром класса? - PullRequest
3 голосов
/ 02 января 2012

Я бы хотел создать функцию Template Haskell так, чтобы:

$(isInstanceOf ''Read ''SomeType)

приводил либо к True, если SomeType является экземпляром Read, либо к False в противном случае.

Я попытался посмотреть на результат reify, и мне кажется, что я ищу содержимое конструктора ClassI, но документации немного не хватает, и у меня возникают проблемы с расшифровкой того, что мне нужно,Может ли кто-нибудь дать руководство о том, где искать данные, необходимые для создания вышеуказанной функции?

1 Ответ

3 голосов
/ 12 января 2012

Шаблон Haskell уже предоставляет функцию , которая делает почти то, что вы хотите. Он существует начиная с версии 2.5, и до этого я не знал о каких-либо средствах поиска экземпляров.

Разница в том, что существующая функция isClassInstance принимает Name для класса - это то, что вы получаете от чего-то вроде ''Read - но Type для поиска экземпляров. Это, вероятно, имеет больше смысла, потому что с Name нет очевидного способа проверить экземпляры, которые требуют параметров типа. Например, вы не сможете напрямую проверить, имеет ли [Int] экземпляр Show или Either String является экземпляром Monad.

Обратите внимание, что Type можно построить почти так же легко, как Name, используя цитату, например, Вы могли бы написать что-то вроде $(isInstanceOf ''Monad [t| Either String |]).

Учитывая вышесказанное, все, что вам нужно сделать, это немного жонглировать, чтобы получить полезное значение из соединения, каким бы вы ни хотели, чтобы оно было.

...