我想创建一个Template Haskell函数,以便:
$(isInstanceOf ''Read ''SomeType)
如果True
是SomeType
的实例,则将导致Read
,否则将导致False
。
我试着查看reify
的结果,我想我正在寻找ClassI
构造函数的内容,但文档有点缺乏,我无法破译我的内容需要。有人可以提供关于在哪里查找创建上述功能所需数据的指导吗?
答案 0 :(得分:3)
模板Haskell已经提供了a function 几乎你想要的东西。它是从版本2.5开始的,在此之前我根本不知道有任何查找实例的方法。
不同之处在于,现有的isClassInstance
函数为该类提供了Name
- 这是您从''Read
获得的 - 但Type
为Name
寻找实例。这可能更有意义,因为使用[Int]
没有明显的方法来检查需要类型参数的实例。例如,您无法直接检查Show
是否有Either String
个实例,或Monad
是否为Type
个实例。
请注意,Name
的构建方式几乎与使用引文的$(isInstanceOf ''Monad [t| Either String |])
一样容易构建,例如你可以写{{1}}之类的东西。
鉴于上述情况,所有你需要做的就是从拼接中返回一个有用的值,无论你想要的是什么。