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