2016-11-17 17 views
5

Tôi đang cố gắng sử dụng F # làm REPL và tập lệnh sử dụng thư viện C#. Khi tôi đánh giá một đối tượng trong REPL, nó sẽ in cấu trúc bên trong của nó:Cách in từ F # như REPL không

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

Sau đó, tôi đang viết một tập lệnh có cùng biểu thức và muốn in cùng một đầu ra. Nhưng tôi không thể tìm thấy bất kỳ chức năng print nào có thể thực hiện được. Gần nhất tôi có thể tìm thấy là printfn "%O" trong đó sử dụng ToString() phương pháp, mà không được xác định trong trường hợp của tôi và chỉ in các loại đối tượng.

Điều này có vẻ là một câu hỏi đơn giản nhưng tôi không thể tìm thấy câu hỏi được trả lời ở đây hoặc bất kỳ nơi nào trong Google.

How to generate the F# type signature similar to FSI in my own code? dường như tập trung vào loại và tôi về cơ bản cần có giá trị khá được in.

PS: có vẻ như đó là mã bên trong fsi.exe. Xem các nguồn fsi.fssformat.fs. Tôi đã cố gắng gọi chúng thông qua sự phản chiếu, nhưng chỉ đơn giản là Internal.Utilities.StructuredFormat.any_to_string(value) chỉ in một loại. Sẽ vẫn tốt nếu ai biết làm thế nào để gọi nó một cách chính xác, nhưng trong thời gian tôi quyết định không dành nhiều nỗ lực vào nó.

+2

Bản sao có thể có của [Cách tạo chữ ký loại F # tương tự như FSI trong mã của riêng tôi?] (Http://stackoverflow.com/questions/9908052/how-to-generate-the-f-type-signature-similar -to-fsi-in-my-own-code) – TheInnerLight

+0

điều gì về: http://stackoverflow.com/questions/791706/how-do-i-customize-output-of-a-custom-type-using-printf ? –

+0

@ helge-rene-urholm dường như liên quan đến việc thay đổi loại đối tượng; Tôi không thể làm điều đó vì nó từ thư viện. Trên thực tế, tôi tự hỏi làm thế nào họ đạt được "cả hai báo cáo in sản lượng: {a = 5;}" kết quả ở đó; đây chính xác là những gì tôi cần – max630

Trả lời

0

Tôi chỉ có cùng một vấn đề, nhưng trong trường hợp của tôi, printfn "%A" cho chính xác kết quả tương tự như những gì tôi nhìn thấy trong F # Interactive (bar thụt đầu dòng):

Đối với một danh sách:

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

Đối với một kỷ lục:

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

cho một tổ chức phi-F # datatype:

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

nó trông giống như phương thức .ToString được định nghĩa đúng. Trong trường hợp của tôi không có. Các đầu ra từ REPL in đối tượng internals sau đó. – max630

+0

Tôi nghĩ rằng sau đó tôi vẫn không nhận được vấn đề của bạn. Các kiểu dữ liệu mà bạn nhận được một đầu ra khác nhau trong REPL, khi so sánh với những gì bạn nhận được khi sử dụng 'printfn"% A "' là gì? Một số lớp C#? –

+0

Có, lớp C#. Từ một số thư viện không phải của tôi. Tôi sẽ cố gắng để cung cấp ví dụ như tôi có thời gian, nhưng theo như tôi nhớ nó rất đơn giản. – max630

Các vấn đề liên quan