Haskell:如何判断类型是否是类的实例?

时间:2012-01-01 23:51:44

标签: haskell template-haskell

我想创建一个Template Haskell函数,以便:

$(isInstanceOf ''Read ''SomeType)
如果TrueSomeType的实例,则

将导致Read,否则将导致False

我试着查看reify的结果,我想我正在寻找ClassI构造函数的内容,但文档有点缺乏,我无法破译我的内容需要。有人可以提供关于在哪里查找创建上述功能所需数据的指导吗?

1 个答案:

答案 0 :(得分:3)

模板Haskell已经提供了a function 几乎你想要的东西。它是从版本2.5开始的,在此之前我根本不知道有任何查找实例的方法。

不同之处在于,现有的isClassInstance函数为该类提供了Name - 这是您从''Read获得的 - 但TypeName寻找实例。这可能更有意义,因为使用[Int]没有明显的方法来检查需要类型参数的实例。例如,您无法直接检查Show是否有Either String个实例,或Monad是否为Type个实例。

请注意,Name的构建方式几乎与使用引文的$(isInstanceOf ''Monad [t| Either String |])一样容易构建,例如你可以写{{1}}之类的东西。

鉴于上述情况,所有你需要做的就是从拼接中返回一个有用的值,无论你想要的是什么。