2012-01-01 5 views
3

Я хотел бы создать функцию шаблона Haskell, что:Haskell: Как определить, является ли тип экземпляром класса?

$(isInstanceOf ''Read ''SomeType) 

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

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

ответ

3

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

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

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

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

Смежные вопросы