2012-02-25 89 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