我正在尝试接听电话sprintf
功能。这是我的尝试:
let p format args = "That was: " + (sprintf format args)
let a = "a"
let b = "b"
let z1 = p "A %s has invalid b" a
这似乎有效,输出是
val p : format:Printf.StringFormat<('a -> string)> -> args:'a -> string
val a : string = "a"
val b : string = "b"
val z1 : string = "That was: A a has invalid b"
但它不适用于多个参数:
let z2 = p "A %s has invalid b %A" a b
我收到编译时错误:
let z2 = p "A %s has invalid b %A" a b;;
---------^^^^^^^^^^^^^^^^^^^^^^^^^^^
stdin(7,10): error FS0003: This value is not a function and cannot be applied
如何创建一个可以处理任意数量参数的单个函数?
UPD。托马斯建议使用
let p format = Printf.kprintf (fun s -> "This was: " + s) format
它确实有效。这是一个例子
let p format = Printf.kprintf (fun s -> "This was: " + s) format
let a = p "something like %d" 123
// val p : format:Printf.StringFormat<'a,string> -> 'a
// val a : string = "This was: something like 123"
但问题是我的函数的主要目的是做一些除格式化之外的工作,所以我尝试使用建议的代码,如下所示
let q format =
let z = p format // p is defined as suggested
printf z // Some work with formatted string
let z = q "something like %d" 123
并且它不再起作用:
let z = q "something like %d" 123;;
----------^^^^^^^^^^^^^^^^^^^
stdin(30,15): error FS0001: The type ''c -> string' is not compatible with the type 'Printf.TextWriterFormat<('a -> 'b)>'
我该如何解决它?