2016-11-17 49 views
5

我想使用F#作爲一個REPL和腳本,它使用C#庫。當我評價REPL一個對象,它打印出它的內部結構:如何從F#打印像REPL不

> <expression>;; 
val it: <type> = 
<subtype> {<prop> = <value>; 
      ... 
      <prop> = <value>;} 

然後我寫以同一表達式的腳本,並希望它打印相同的輸出。但我找不到任何可以做到這一點的功能。我能找到的最接近的是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)只是打印一個類型。如果有人知道如何正確調用它,那仍然會很好,但是暫時我決定不花費更多的精力。

+2

的可能的複製[如何在自己的代碼生成類似於FSI的F#類型簽名?](http://stackoverflow.com/questions/9908052/how-to-generate-the-f-type-signature-similar -to-FSI功能於我 - 自己的代碼) – TheInnerLight

+0

怎麼樣:http://stackoverflow.com/questions/791706/how-do-i-customize-output-of-a-custom-type-using-printf ? –

+0

@ helge-rene-urholm似乎涉及改變對象類型本身;我無法做到這一點,因爲它來自圖書館。實際上,我想知道他們是如何實現的:「這兩種印刷品收益率都是:{a = 5;}」。這正是我所需要的 – max630

回答

0

我有同樣的問題,但對我來說,printfn "%A"都花了整整(巴壓痕)相同的結果,我在F#互動看:

有關列表:

> 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/ 
+0

它看起來像正確定義的.ToString方法。在我的情況下沒有。 REPL的輸出然後打印對象內部。 – max630

+0

我認爲我仍然沒有得到你的問題。與使用'printfn'%A「'時相比,您在REPL中獲得不同輸出的數據類型是什麼?一些C#類? –

+0

是的,C#類。從一些不是我的圖書館。我會盡我所能提供範例,但據我記憶,這非常簡單。 – max630