如何在我自己的代码中生成类似于FSI的F#类型签名?

时间:2012-03-28 13:00:28

标签: f# type-inference linqpad f#-interactive

如果使用F#Interactive Shell(FSI),则推断的表达式类型(signature)将与其值一起打印到控制台:

val it : int * string * float = (42, "Hello F#", 42.0)

如何在我自己的代码中模仿相同的行为,例如将推断类型作为F#表达式的字符串获取?

我不需要动态评估任何F#表达式,这些表达式在编译时是已知的,并且是我的(静态)F#代码的一部分。我需要这个功能才能在我的F#演示中模仿LINQPad中的FSI输出。

2 个答案:

答案 0 :(得分:11)

使用Unquote

Unquote具有获取类型的F#签名的工具。只需下载最新版本并通过LINQPad向Unquote.dll添加引用,然后就可以执行此操作。

enter image description here

如果您有兴趣,可以使用源代码达到峰值,以实现FSharpName Type扩展程序:http://code.google.com/p/unquote/source/browse/tags/2.1.0/Unquote/ExtraReflection.fs#54

使用FsEye

另一种巧妙的方法是使用LINQPad的beta Custom Visualizer API将FsEye嵌入到LINQPad中(FsEye使用与Unquote相同的F#类型签名打印算法)。这也很简单,你需要做的就是从最新版本的FsEye下载LINQPad beta,下载并引用FsEye.dll,然后你可以做到这一点。

enter image description here

答案 1 :(得分:1)

如果您查看F#编译器代码并查看编译器如何处理--sig选项,我认为这将为您提供所需的内容。有关--sig选项和签名的更多信息,请点击此处:

Signatures (F#)