簡體   English   中英

F#printfn異常

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM