2016-11-17 14 views
5

Próbuję użyć F # jako REPL i skrypt, który używa biblioteki C#. Kiedy ocenić obiekt w REPL, drukuje swoją wewnętrzną strukturę:Jak drukować z F # jak REPL ma

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

Następnie Piszę skrypt z tego samego wyrazu i chcesz go wydrukować samą moc. Ale nie mogę znaleźć żadnej funkcji, która by to zrobiła. Najbliższe, jakie mogłem znaleźć, to printfn "%O", które używa metody ToString(), która nie jest zdefiniowana w moim przypadku i po prostu drukuje typ obiektu.

To proste pytanie, ale nie mogę go znaleźć tutaj ani w Google.

How to generate the F# type signature similar to FSI in my own code? wydaje się być skoncentrowany na typie, a ja zasadniczo potrzebuję raczej ładnie wydrukowanej wartości.

PS: wygląda na to, że jest to kod wewnętrzny dla fsi.exe. Zobacz źródła fsi.fs i sformat.fs. Próbowałem przywołać je poprzez odbicie, ale prosty Internal.Utilities.StructuredFormat.any_to_string(value) wydrukowano tylko jako typ. Nadal byłoby miło, gdyby ktokolwiek wiedział, jak prawidłowo go przywołać, ale na razie postanowiłem nie poświęcać mu więcej wysiłku.

+2

Możliwy duplikat [Jak wygenerować podpis typu F # podobny do FSI w moim własnym kodzie?] (Http://stackoverflow.com/questions/9908052/how-to-generate-the-f-type-signature-similar -to-fsi-in-my-own-code) – TheInnerLight

+0

co powiesz na: http://stackoverflow.com/questions/791706/how-do--- customize-output-of-a-custom-type-using-printf ? –

+0

@ helge-rene-urholm, który wydaje się obejmować zmianę samego typu obiektu; Nie mogę tego zrobić, ponieważ pochodzi z biblioteki. Właściwie to zastanawiam się, w jaki sposób osiągnęli "wynik drukowania obu wydruków: {a = 5;}"; to jest dokładnie to, czego potrzebowałbym – max630

Odpowiedz

0

prostu miałem ten sam problem, ale w moim przypadku, printfn "%A" dał dokładnie taki sam wynik, jak to, co widzę w F # Interactive (bar wcięcie):

Listę:

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

dla rekordu:

> 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;} 

dla nie-F # Typ danych:

> let u = UriBuilder("http", "bar", 80);; 
val u : UriBuilder = http://bar:80/ 
> printfn "%A" u;; 
http://bar:80/ 
+0

wygląda jak prawidłowo zdefiniowana metoda .ToString. W moim przypadku nie było żadnego. Dane wyjściowe z REPL drukują obiekty wewnętrzne. – max630

+0

Myślę, że nadal nie dostaję twojego problemu. Jakie są typy danych, dla których otrzymujesz różne wyniki w REPL, w porównaniu do tego, co otrzymujesz, gdy używasz 'printfn"% A "'? Niektóre klasy C#? –

+0

Tak, klasa C#. Z jakiejś biblioteki, która nie jest moja. Postaram się dać przykład, jak mam czas, ale o ile pamiętam, było to bardzo proste. – max630