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

标签 haskell template-haskell

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

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

将返回 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/

相关文章:

haskell - "strict returns"的语义是什么?

haskell - 柯里化(Currying)产品类型

list - Do-notation 和列表单子(monad)

haskell - 带有模板 haskell 的多个函数定义

haskell - 子网站类型之谜

haskell - <$> 和 fmap 的区别

haskell - GHC 测试套件中的这个简短的内存功能是如何工作的?

haskell - 处理有限但任意数量的异构元素的函数

haskell - 存在量词默默地破坏了 Template Haskell (makeLenses)。为什么?

haskell - 在不使用列表的情况下内嵌长字符串