如何:在ghci中访问所有内省信息?

时间:2011-03-29 17:54:10

标签: haskell introspection typeclass ghci

似乎不可能对函数和数据类型等类型类约束进行内省。但是,ghci似乎也是这样做的。

Prelude> :t show
show :: (Show a) => a -> String

所以...不知怎的,它知道类型类约束,因为它打印出来。它是如何做到的?

2 个答案:

答案 0 :(得分:10)

信息保存在接口文件(module.hi)中。要在正在运行的程序中获取它,您需要查找并阅读.hi文件(Hackage上的Hint包执行此操作,我相信);由于ghci在编译为字节码的过程中读取.hi文件,因此可以方便地获取该信息。

您可以使用.hi查看ghc --show-iface module.hi文件中的内容。

答案 1 :(得分:3)

单独编译的“二进制文件”是“.hi”文件。它们包含所有类型信息,因此您可以编写使用它们的代码,它们包含所有类型类定义和所有类型类实例,以便您的代码可以使用或扩展它们。

因此ghci将源代码编译为“.hi”并加载所有依赖的“.hi”文件。这使它完全了解所有类型。 ghci不需要做的是返回所有导入模块的源代码,它只需要“.hi”文件。