2012-02-25 95 views
23

林不解F#的printf字符串

let test = "aString" 

let callMe = 
    printfn test 

爲什麼不是這方面的工作?下面拋出錯誤在編譯時:

類型 '串' 不與類型兼容「Printf.TextWriterFormat < '一>'

這工作得很好:

printfn "aString" 

回答

40

這是因爲format參數實際上不是string。它是TextWriterFormat<'T>,F#編譯器將字符串格式轉換爲該類型。但它不適用於string變量,因爲編譯器在運行時無法將string轉換爲TextWriterFormat<'T>

如果您想打印變量的內容,您甚至不應該嘗試以這種方式使用printfn,因爲變量可能包含格式規範。

您可以使用%s格式:

printfn "%s" test 

或者使用.NET Console.WriteLine()

Console.WriteLine test 

不要忘了在文件的頂部添加open System如果你想使用Console類。

+0

我想補充一點,使用'Console.WriteLine'在F#代碼不地道,和'printf'版本是更常見。 – 2012-02-25 05:02:23

+1

如果編譯器將其轉換,我想是啊。 結束與printfn「%s」測試 – CodeMonkey 2012-02-25 19:31:26

+5

你也可以做'stdout.WriteLine測試',我猜測唯一的優點是它是一個字符較短,你不需要打開'系統' – 2012-02-26 05:44:18

4

在什麼svick說行,你也可以試試這個:

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

Nope;價值限制。 – 2018-01-01 06:04:28