2012-01-01 89 views
3

我想创建一个模板哈斯克尔功能使得:Haskell:如何判断一个类是否是类的一个实例?

$(isInstanceOf ''Read ''SomeType) 

将导致True如果SomeType是任Read一个实例,False否则。

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

回答

3

模板Haskell已经提供了a function差不多你想要什么。它是2.5版本以前的版本,在此之前我根本没有意识到有任何方法可以查找实例。

所不同的是,现有的isClassInstance功能需要一个Name的类 - 这是你从像''Read - 但一个Type得到什么,以寻找与实例。这可能更有意义,因为使用Name没有明显的方法来检查需要类型参数的实例。例如,您将无法直接检查[Int]是否有Show实例,或者Either String是否为Monad实例。

请注意,Type可以使用一个引号,例如与Name几乎一样容易地构建。你可以写一些像$(isInstanceOf ''Monad [t| Either String |])的东西。

鉴于上述情况,您所要做的只是从拼接中返回一个有用的值,无论您希望如此。

相关问题