我想创建一个 Template Haskell 函数,以便:
$(isInstanceOf ''Read ''SomeType)
如果 SomeType
是 Read
的实例,则 将返回 True
,否则返回 False
。
我尝试查看 reify
的结果,我想我正在寻找 ClassI
构造函数的内容,但文档有些缺乏,我'我无法理解我需要什么。有人可以提供有关在哪里查找创建上述函数所需的数据的指导吗?
最佳答案
模板 Haskell 已经提供 a function这几乎就是你想要的。它从 2.5 版本开始就存在,在此之前我根本不知道有任何方法可以查找实例。
不同之处在于,现有的 isClassInstance
函数采用类的 Name
- 这是您从 ''Read
等内容中获得的内容>--而是一个用于查找实例的Type
。这可能更有意义,因为使用 Name
没有明显的方法来检查需要类型参数的实例。例如,您无法直接检查 [Int]
是否具有 Show
实例,或者 Either String
是否是 >Monad
实例。
请注意,Type
几乎可以像使用引号构造 Name
一样容易,例如您可以编写类似 $(isInstanceOf ''Monad [t| Either String |])
的内容。
鉴于上述情况,您所要做的就是进行一些杂耍,以从拼接返回有用的值,无论您想要什么。
关于Haskell:如何判断类型是否是类的实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8696408/