如何从F#打印像REPL一样

时间:2016-11-17 12:19:10

标签: f#

我正在尝试使用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.fssformat.fs来源。我试图通过反射来调用它们,但简单的Internal.Utilities.StructuredFormat.any_to_string(value)只打印了一个类型。如果有人知道如何正确调用它仍然会很好,但暂时我决定不再花费更多的精力。

1 个答案:

答案 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/