我正在尝试使用F#作为REPL和使用C#库的脚本。当我在REPL中评估一个对象时,它会打印出它的内部结构:
> <expression>;;
val it: <type> =
<subtype> {<prop> = <value>;
...
<prop> = <value>;}
然后我正在编写一个具有相同表达式的脚本,并希望它打印相同的输出。但我找不到任何可以做到的print
函数。我能找到的最接近的是printfn "%O"
,它使用ToString()方法,在我的情况下没有定义,只打印对象类型。
这似乎是一个简单的问题,但我无法在这里或谷歌的任何地方找到答案。
How to generate the F# type signature similar to FSI in my own code?似乎专注于类型,我基本上需要相当漂亮的印刷价值。
PS:好像是fsi.exe内部的代码。查看fsi.fs和sformat.fs来源。我试图通过反射来调用它们,但简单的Internal.Utilities.StructuredFormat.any_to_string(value)
只打印了一个类型。如果有人知道如何正确调用它仍然会很好,但暂时我决定不再花费更多的精力。
答案 0 :(得分:0)
我遇到了同样的问题,但就我而言,printfn "%A"
给出的结果与我在F#Interactive中看到的结果完全相同(bar缩进):
列表:
> let l = [(2,"a")];;
val l : (int * string) list = [(2, "a")]
> printfn "%A" l;;
[(2, "a")]
记录:
> 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;}
对于非F#数据类型:
> let u = UriBuilder("http", "bar", 80);;
val u : UriBuilder = http://bar:80/
> printfn "%A" u;;
http://bar:80/