3
我正在試圖打包sprintf
函數的調用。這裏是我的嘗試:魔術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"
,但它不會有一個以上的ARG工作:
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
我該怎麼辦cre吃了一個單一的功能,可以處理任何數量的參數?
UPD。 Tomas建議使用
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"
但事實是,我的函數的主要目的是做了一些工作,除了formatring,所以我嘗試如下
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
使用建議的代碼和它doesn」 t再次工作:
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)>'
我該如何解決它?
+1謝謝你的建議。我的情況有點複雜。你可以看看關於這個問題的更新嗎? – Rustam
主要問題是我沒有看到像「xxx%s」這樣的字符串是如何轉換爲「StringFormatter」類的,以及當我寫入'printfn「%」12'時到底發生了什麼。也許你有任何鏈接解釋? – Rustam
@Rustam - 您必須將所有您想要對格式化的字符串進行的工作放在後面。請參閱擴展示例。 –