似乎不可能对函数和数据类型等类型类约束进行内省。但是,ghci似乎也是这样做的。
Prelude> :t show
show :: (Show a) => a -> String
所以...不知怎的,它知道类型类约束,因为它打印出来。它是如何做到的?
答案 0 :(得分:10)
信息保存在接口文件(module.hi
)中。要在正在运行的程序中获取它,您需要查找并阅读.hi
文件(Hackage上的Hint包执行此操作,我相信);由于ghci
在编译为字节码的过程中读取.hi
文件,因此可以方便地获取该信息。
您可以使用.hi
查看ghc --show-iface module.hi
文件中的内容。
答案 1 :(得分:3)
单独编译的“二进制文件”是“.hi”文件。它们包含所有类型信息,因此您可以编写使用它们的代码,它们包含所有类型类定义和所有类型类实例,以便您的代码可以使用或扩展它们。
因此ghci将源代码编译为“.hi”并加载所有依赖的“.hi”文件。这使它完全了解所有类型。 ghci不需要做的是返回所有导入模块的源代码,它只需要“.hi”文件。