6

内省函数和数据类型等的类型类约束似乎是不可能的。但是,ghci 似乎可以做到这一点。

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

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

4

2 回答 2

10

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

您可以.hi使用ghc --show-iface module.hi.

于 2011-03-29T18:00:31.767 回答
3

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

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

于 2011-03-29T18:21:58.200 回答