ghci 中的 :t 如何访问所有内省信息?
似乎不可能内省函数和数据类型等的类型类约束。然而,ghci 似乎做到了。
Prelude> :t show
show :: (Show a) => a -> String
所以......不知何故它知道类型类约束,因为它正在打印它。它是怎么做到的?
It appears to be impossible to introspect type class constraints on functions and data types and such. However, ghci appears to do it.
Prelude> :t show
show :: (Show a) => a -> String
So... somehow it knows the type class constraint since it's printing it out. How is it doing that?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
该信息保存在接口文件 (
module.hi
) 中。要从正在运行的程序中获取它,您需要找到并读取.hi
文件(提示我相信 Hackage 上的 包就是这样做的);由于 ghci 在编译为字节码的过程中读取 .hi 文件,因此可以方便地获取该信息。您可以使用
ghc --show-iface module.hi
查看.hi
文件中的内容。The information is kept in interface files (
module.hi
). To get at it from in a running program you would need to find and read the.hi
files (the Hint package on Hackage does this, I believe); sinceghci
reads the.hi
files in the course of compiling to bytecode, it has that information conveniently available.You can see what's in a
.hi
file withghc --show-iface module.hi
.单独编译的“二进制文件”是“.hi”文件。它们包含所有类型信息,以便您可以编写使用它们的代码,并且它们包含所有类型类定义和所有类型类实例,以便您的代码可以使用或扩展它们。
因此 ghci 将源代码编译为“.hi”并加载所有依赖的“.hi”文件。这使它能够完美地了解所有类型。 ghci 不需要做的是返回所有导入模块的源,它只需要“.hi”文件。
The separately compiled "binaries" are the ".hi" files. These contain all the type information so that you can write code that uses them, and they contain all the type class definitions and all the type class instances so that your code can use or extend them.
Thus ghci compile source to ".hi" and loads all the dependent ".hi" files. This gives it perfect knowledge of all the types. What ghci does not need to do is go back to the source of all the imported modules, it only needs the ".hi" files.