我希望在F#中创建一个函数,该函数接受一个printf风格的函数作为参数,并使用该参数输出数据。使用方法类似于以下内容:
那个失败了,因为它认为
接下来,我尝试声明
OutputStuff printfn
我的第一次尝试是让编译器为我解决所有问题:
let OutputStuff output =
output "Header"
output "Data: %d" 42
那个失败了,因为它认为
output
是一个接受string
并返回unit
的函数,所以第二个调用失败了。接下来,我尝试声明
output
具有与printfn
相同的签名:let OutputStuff (output : Printf.TextWriterFormat<'a> -> 'a) =
output "Header"
output "Data: %d" 42
这段代码失败了,因为编译器决定output
的真实类型是Printf.TextWriterFormat<string> -> unit
,所以第二次调用也失败了。它还生成警告FS0064,指出第一次对output
的调用导致代码比类型注释更不通用,这是问题的关键。
最后,我尝试将输出函数声明为一个单独的类型缩写:
type OutputMe<'a> = Printf.TextWriterFormat<'a> -> 'a
let OutputStuff (output : OutputMe<'a>) =
output "Header"
output "Data: %d" 42
这个尝试失败,结果和之前的一样。
我该如何说服编译器不去特化 output
的类型,而是将其保留为 Printf.TextWriterFormat<'a> -> 'a
呢?
string
并且你想用格式化的字符串调用它,只需使用Printf.ksprintf
与你的函数。 - Jack P.Printf.ksprintf
。 - Jack P.