如何从F#打印像REPL一样

max*_*630 5 f#

我试图使用F#作为REPL和使用C#库的脚本.当我在REPL中评估一个对象时,它会打印出它的内部结构:

> <expression>;;
val it: <type> =
 <subtype> {<prop> = <value>;
            ...
            <prop> = <value>;}
Run Code Online (Sandbox Code Playgroud)

然后我正在编写一个具有相同表达式的脚本,并希望它打印相同的输出.但我找不到任何print可以做到的功能.我能找到的最接近的是printfn "%O"使用ToString()方法,在我的情况下没有定义,只打印对象类型.

这似乎是一个简单的问题,但我无法在这里或谷歌的任何地方找到答案.

如何在我自己的代码中生成类似于FSI的F#类型签名?似乎专注于类型,我基本上需要相当漂亮的印刷价值.

PS:好像是fsi.exe内部的代码.请参阅fsi.fssformat.fs源.我试图通过反射调用它们,但简单的Internal.Utilities.StructuredFormat.any_to_string(value)打印只是一种类型.如果有人知道如何正确调用它仍然会很好,但暂时我决定不花更多的精力.

Ant*_*fer 0

我刚刚遇到了同样的问题,但就我而言,printfn "%A"给出的结果与我在 F# Interactive 中看到的结果完全相同(除了缩进):

对于列表:

> let l = [(2,"a")];;
val l : (int * string) list = [(2, "a")]
> printfn "%A" l;;
[(2, "a")]
Run Code Online (Sandbox Code Playgroud)

记录一下:

> type R = { A: string; B: int };;
type R =
  {A: string;
   B: int;}
> let r = { A = "Foo"; B = 1 };;
val r : R = {A = "Foo";
             B = 1;}
> printfn "%A" r;;
{A = "Foo";
 B = 1;}
Run Code Online (Sandbox Code Playgroud)

对于非 F# 数据类型:

> let u = UriBuilder("http", "bar", 80);;
val u : UriBuilder = http://bar:80/
> printfn "%A" u;;
http://bar:80/
Run Code Online (Sandbox Code Playgroud)