我试图使用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.fs和sformat.fs源.我试图通过反射调用它们,但简单的Internal.Utilities.StructuredFormat.any_to_string(value)打印只是一种类型.如果有人知道如何正确调用它仍然会很好,但暂时我决定不花更多的精力.
我刚刚遇到了同样的问题,但就我而言,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)