2012-02-25 28 views
23

Im bối rốiF # printf chuỗi

let test = "aString" 

let callMe = 
    printfn test 

Tại sao không phải là làm việc này? Ném dưới đây lỗi tại thời gian biên dịch:

Loại 'string' là không tương thích với các loại 'Printf.TextWriterFormat < 'a>'

này hoạt động tốt:

printfn "aString" 

Trả lời

40

Đó là vì thông số format không thực sự là string. Đó là TextWriterFormat<'T> và trình biên dịch F # chuyển đổi định dạng chuỗi thành loại đó. Nhưng nó không hoạt động trên các biến số string, bởi vì trình biên dịch không thể chuyển đổi string thành TextWriterFormat<'T> khi chạy.

Nếu bạn muốn in nội dung của biến, bạn thậm chí không nên cố sử dụng printfn theo cách này, vì biến có thể chứa thông số định dạng.

Bạn có thể sử dụng định dạng %s:

printfn "%s" test 

Hoặc sử dụng Net Console.WriteLine():

Console.WriteLine test 

Đừng quên để thêm open System ở phía trên cùng của tập tin nếu bạn muốn sử dụng lớp Console.

+0

Tôi muốn nói thêm rằng sử dụng 'Console.WriteLine' trong F # mã không thành ngữ, và 'phiên bản printf' là phổ biến hơn nhiều . –

+1

Ah ok có ý nghĩa nếu trình biên dịch chuyển đổi nó tôi đoán. Kết thúc với printfn "% s" kiểm tra – CodeMonkey

+5

bạn cũng có thể làm 'stdout.WriteLine test' nơi tôi đoán lợi thế duy nhất là nó là một char ngắn hơn và bạn không cần phải mở' System' –

4

Phù hợp với những gì svick nói, bạn cũng có thể thử điều này:

let test = "aString" 
let callMe = printfn (Printf.TextWriterFormat<_> test) 
callMe 
+0

Không; hạn chế giá trị. –

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