[英]F# printfn anomaly
誰能解釋這導致錯誤的原因:
let xs = [| "Mary"; "Mungo"; "Midge" |]
Array.iter printfn xs
雖然這不能:
Array.iter printfn [| "Mary"; "Mungo"; "Midge" |]
printfn的簽名是Printf.TextWriterFormat<'a> -> 'a
。 編譯器將字符串的文字值推斷為Printf.TextWriterFormat<unit>
但不能對動態字符串進行推斷。
您可以通過添加正確的類型注釋來幫助第一個示例中的編譯器:
let xs: Printf.TextWriterFormat<unit> [] = [| "Mary"; "Mungo"; "Midge" |]
Array.iter printfn xs
或使用顯式構造函數:
let xs = [| "Mary"; "Mungo"; "Midge" |]
Array.iter (fun s -> printfn <| Printf.TextWriterFormat<unit>(s)) xs
通常,這樣做太冗長。 因此,為字符串指定格式字符串,例如"%s"
,為類型指定"%O"
以覆蓋ToString()
方法是一個好方法:
let xs = [| "Mary"; "Mungo"; "Midge" |]
Array.iter (printfn "%s") xs
除了@pad的出色答案。
造成混淆的主要原因是對論據發生了誤解。 讓我們看一下單迭代。 應該是
printfn "%s" "Mary" // or whatever default format specifier instead of %s
但是實際上
printfn "Mary" ()
因此, "Mary"
不是要格式化的字符串。 它是一種格式說明符 ,雖然沒什么用,但非常適合格式化一個unit
。
嘗試對您的示例進行此修改:
Array.iter printfn [| "Mary %s"; "Mungo"; "Midge" |]
它將拒絕編譯。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.