我想在 F# 中创建一个函数,它接受 printf 样式的函数作为参数,并使用该参数输出数据。用法如下所示:
OutputStuff printfn
我的第一次尝试是让编译器为我解决所有问题:
let OutputStuff output =
output "Header"
output "Data: %d" 42
那失败了,因为它决定那output
是一个函数 takestring
和 return 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
这失败了,结果与上一次尝试相同。
如何说服编译器不专门化 of 的类型output
并将其保留为Printf.TextWriterFormat<'a> -> 'a
?