我想创建一个模板 Haskell 函数,这样:
$(isInstanceOf ''Read ''SomeType)
将导致True
ifSomeType
是 , 的实例Read
,False
否则。
我试图查看的结果,reify
我想我正在寻找ClassI
构造函数的内容,但是文档有些缺乏,而且我在破译我需要的东西时遇到了麻烦。有人可以就在哪里查找创建上述函数所需的数据提供指导吗?
我想创建一个模板 Haskell 函数,这样:
$(isInstanceOf ''Read ''SomeType)
将导致True
ifSomeType
是 , 的实例Read
,False
否则。
我试图查看的结果,reify
我想我正在寻找ClassI
构造函数的内容,但是文档有些缺乏,而且我在破译我需要的东西时遇到了麻烦。有人可以就在哪里查找创建上述函数所需的数据提供指导吗?
模板 Haskell 已经提供了一个功能,几乎可以满足您的需求。它从 2.5 版开始就存在,在此之前我根本不知道有任何方法可以查找实例。
不同之处在于,现有isClassInstance
函数采用 aName
作为类——这是你从类似的东西中得到的——但''Read
a 是Type
用来寻找实例的。这可能更有意义,因为Name
没有明显的方法来检查需要类型参数的实例。例如,您将无法直接检查是否[Int]
有Show
实例,或者是否Either String
是Monad
实例。
请注意,aType
几乎可以像Name
使用引号一样简单地构造,例如,您可以编写类似$(isInstanceOf ''Monad [t| Either String |])
.
鉴于上述情况,您所要做的就是花点功夫从拼接处返回一个有用的值,无论您想要什么。